接受整数作为**kwargs的键

wim*_*wim 8 python keyword-argument

关键字必须是字符串

>>> def foo(**kwargs):
...     pass
... 
>>> foo(**{0:0})
TypeError: foo() keywords must be strings
Run Code Online (Sandbox Code Playgroud)

但是通过一些黑魔法,命名空间能够绕过它

>>> from types import SimpleNamespace
>>> SimpleNamespace(**{0:0})
namespace()
Run Code Online (Sandbox Code Playgroud)

为什么?而如何你能实现一个可以在kwargs映射中接收整数的Python函数吗?

Mar*_*ers 7

你能实现一个可以在kwargs映射中接收整数的Python函数吗?

不,你不能.Python评估循环处理Python代码中定义的调用函数与调用C代码中定义的可调用对象不同.处理关键字参数扩展的Python评估循环代码牢牢地关闭了非字符串关键字参数.

SimpleNamespace它不是Python定义的可调用的,它完全用C代码定义.它直接接受关键字参数,无需任何验证,这就是为什么你可以传入一个带有非字符串关键字参数的字典.

那可能是个错误; 你应该使用C-API参数解析函数,这些函数都可以防止非字符串关键字参数.但SimpleNamespace它只被设计为保存sys.implementation数据*的对象,并没有真正设计用于其他用途.

可能还有其他类似的异常,但它们都是C定义的callables,而不是Python函数.


*time.get_clock_info()方法还运行SimpleNamespace该类的实例; 它是目前使用该类型的唯一其他地方.


Kev*_*vin 2

SimpleNamespace 现在拒绝整数关键字键。正如 Martijn 推测的那样,最初的行为是一个错误。似乎它已由v3.9.0b2 中的bpo-31655: Validate keywords names in SimpleNamespace constructor修复,然后向后移植到 3.6