首先:
**{...}具有非标识符名称的调用约定仅在被调用函数具有**kw接收它们的参数的情况下才有效,因为它也无法定义不是有效标识符的显式关键字参数。
我要说的是,
keyword_arguments语法仅适用于 源代码
的解析器,不能被视为对
**expression结果内容的功能限制。下面的功能描述没有明确限制字典的键,功能定义文档也没有。
相反,因为语法允许的
expression,功能规范规定,应该可以解决的映射 ,其中被视为额外的关键字参数的内容
,很显然(对我)有上的按键没有任何限制 可言
,超越适用于Python词典的普通键(键必须是不可变的)。您可以为所有Python护理传递元组或数字键。功能规格说明内容的处理方式,而不是内容必须符合特定格式。
因此,在我看来,功能规范必须 明确
限制
**expression字典中的键以禁止您执行操作,因为语法肯定不会。进行更改将是一个巨大的向后不兼容的更改,并且不可能再添加。
请注意,即使规范未提及字典键的任何限制,CPython也会:
>>> def f(*args, **kw): print args, kw... >>> f(**{1: 2})Traceback (most recent call last): File "<stdin>", line 1, in <module>TypeError: f() keywords must be strings这是python解释器在调用代码对象(用户定义的函数)时做出的限制。在引发上述异常的部分之后的源代码中直接说明了原因:
通过将关键字限制为字符串,可以实现速度优化。



