Пробел в распакованных ключевых словах не приводит к синтаксической ошибке

При обработке атрибутов строки подключения я заметил любопытное поведение при распаковке аргументов 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

Очевидно, нельзя назвать аргументы в определении функции, но мне все еще интересно, что именно происходит. Звонки не идентичны. Есть ли какая-нибудь документация о том, чем они отличаются или как обрабатываются распакованные аргументы по сравнению с простыми аргументами ключевого слова? Итак, если синтаксис был разрешен в определениях, именах переменных и вызове функции, все ли после этого уже работает для разделенных имен аргументов?


person Felix    schedule 27.09.2019    source источник