При обработке атрибутов строки подключения я заметил любопытное поведение при распаковке аргументов Python. Передача аргумента с пробелами в имени работает.
def f(**kwargs):
print(kwargs)
f(spaced keyword=3) # Syntax error
f(**{'spaced keyword': 3}) # Fine
Когда я впервые услышал о распаковке аргументов, я, естественно, предположил, что приведенные выше вызовы будут идентичными. Таким образом, в приведенном выше примере даже распаковка приведет к ошибке. Не синтаксис, но, возможно, что-то связанное с недопустимыми аргументами.
Строка применяется.
f(**{2: 3}) # Type error
Но пустая строка тоже работает.
f(**{'': 3, '\a': 4, '\n': 5}) # Fine
Очевидно, нельзя назвать аргументы в определении функции, но мне все еще интересно, что именно происходит. Звонки не идентичны. Есть ли какая-нибудь документация о том, чем они отличаются или как обрабатываются распакованные аргументы по сравнению с простыми аргументами ключевого слова? Итак, если синтаксис был разрешен в определениях, именах переменных и вызове функции, все ли после этого уже работает для разделенных имен аргументов?