f-string语法用于解包一个带有大括号抑制的列表。

9 浏览
0 Comments

f-string语法用于解包一个带有大括号抑制的列表。

我一直在使用新的f-string格式来研究一些字符串格式选项。我经常需要解压长度未知的列表和其他可迭代对象。目前我使用以下方法...

a = [1, 'a', 3, 'b']
("unpack a list: " + " {} "*len(a)).format(*a)
'unpack a list:  1  a  3  b '

虽然有点繁琐,但这种方式在使用3.6之前的.format标记时能起到作用。

考虑到运行时字符串连接,新的f-string格式选项非常有趣。问题在于我无法复制{}的数量。在我的先前示例中,我只需创建所需结构并在.format()部分中解压。

尝试这样做得到了一个可行的变体,但是:

1) 将两个花括号放在一起不能解压...

'unpack a list'  f' {{*a}}'
'unpack a list {*a}'

2) 在内部{}对周围添加空格:

这样做可以解压,但是会保留开放和关闭的括号{,}:

'unpack a list'  f' { {*a} }'
"unpack a list {1, 3, 'a', 'b'}"

2b) 将变体连接成一个f-string

这样做使外观和语法更好,因为评估显然是从左到右的。但是,这仍然保留了括号:

f'unpack a list { {*a} }'
"unpack a list {1, 3, 'a', 'b'}"

3) 尝试只使用{a}进行自动解包

也许,我对整个过程思考过分了,并希望有某种形式的自动解包。这只会产生用[]替换花括号的列表表示:

f'unpack a list {a}'
"unpack a list [1, 'a', 3, 'b']"

有什么方法可以消除变体(2)中的花括号,或者我必须继续使用现有的.format()方法?我希望保持简单,并利用f-string提供的新功能,而不会回到我目前不熟悉的python版本之前。我开始怀疑f'strings'没有完全覆盖其.format()兄弟提供的所有功能。暂时就这样吧,因为我甚至还没涉及转义编码和无法在f-string中使用\的问题。我已经阅读了PEP并进行了广泛搜索,但是我觉得我可能没有注意到明显的或者我希望的功能目前还不可能实现。

编辑几个小时后:

4) 使用下标手动去掉括号:str(a)[1:-2]

我找到了这个变体,它可以解决我需要的一些情况

f'unpack a list: {str(a)[1:-2]}'
"unpack a list: 1, 'a', 3, 'b"

但是切片只是一种便利,仍然保留了结果周围的字符串引号。

5) @SenhorLucas提供的最终解决方案

a = np.arange(10)
print(f"{*a,}")
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

解压并带有尾随逗号。

0