+-
一段代码的语法错误被接受为str.join的参数

请在python3中阐明此行为:

>>> ''.join('<%s>%s</%s>' % (tag, content, tag) for tag, content in {'b': 'bold'}.items())
'<b>bold</b>'

>>> '<%s>%s</%s>' % (tag, content, tag) for tag, content in {'b': 'bold'}.items()
File "<stdin>", line 1
'<%s>%s</%s>' % (tag, content, tag) for tag, content in {'b': 'bold'}.items()
                                      ^
SyntaxError: invalid syntax

从https://docs.python.org/3/library/stdtypes.html#str.join开始,它的参数应该是可迭代的。如果仔细观察,在本示例中提供的用于连接的相同参数在单独检查时会给出语法错误。

我不明白这应该如何作为参数工作,但是不能作为值进行检查。

感谢您的关注。

1
投票

这是因为您将生成器表达式作为参数传递给join方法(see this bit of documentation和this bit)。

当这种表达用作调用的参数时,可以省略括号。

如果在Python解释器中用括号将表达式括起来,则会看到类似这样的内容:

>>> ('<%s>%s</%s>' % (tag, content, tag) for tag, content in {'b': 'bold'}.items())
<generator object <genexpr> at 0x7f2ab9b044f8>

请注意,当它是调用参数的一部分时,您可以确认不需要括号,例如:

>>> type('<%s>%s</%s>' % (tag, content, tag) for tag, content in {'b': 'bold'}.items())
<class 'generator'>

From the official documentation:

可迭代对象的示例包括所有序列类型(例如list,str和tuple)和一些非序列类型,例如dict,文件对象[...]迭代器可用于for循环以及需要序列的许多其他地方[...]另请参见迭代器,序列和生成器。