Синтаксическая ошибка в фрагменте кода, который принимается в качестве аргумента для str.join - PullRequest
2 голосов
/ 07 апреля 2020

Пожалуйста, поясните это поведение в 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 Ответ

1 голос
/ 07 апреля 2020

Это потому, что вы передаете выражение генератора в качестве аргумента методу join ( см. Этот бит документации и этот бит ).

Когда выражение такого типа используется в качестве аргумента для вызова, вы можете опустить скобки.

Если вы заключите выражение в скобки в интерпретаторе 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'>

Из официальной документации :

Примеры итераций включают в себя все типы последовательностей (например, list, str и tuple) и некоторые непоследовательные типы, такие как dict, файловые объекты [...] Итерации можно использовать в a для l oop и во многих других местах, где требуется последовательность [...] См. Также итератор, последовательность и генератор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...