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函数吗?
你能实现一个可以在kwargs映射中接收整数的Python函数吗?
不,你不能.Python评估循环处理Python代码中定义的调用函数与调用C代码中定义的可调用对象不同.处理关键字参数扩展的Python评估循环代码牢牢地关闭了非字符串关键字参数.
但SimpleNamespace它不是Python定义的可调用的,它完全用C代码定义.它直接接受关键字参数,无需任何验证,这就是为什么你可以传入一个带有非字符串关键字参数的字典.
那可能是个错误; 你应该使用C-API参数解析函数,这些函数都可以防止非字符串关键字参数.但SimpleNamespace它只被设计为保存sys.implementation数据*的对象,并没有真正设计用于其他用途.
可能还有其他类似的异常,但它们都是C定义的callables,而不是Python函数.
*该time.get_clock_info()方法还运行SimpleNamespace该类的实例; 它是目前使用该类型的唯一其他地方.
SimpleNamespace 现在拒绝整数关键字键。正如 Martijn 推测的那样,最初的行为是一个错误。似乎它已由v3.9.0b2 中的bpo-31655: Validate keywords names in SimpleNamespace constructor修复,然后向后移植到 3.6。
| 归档时间: |
|
| 查看次数: |
669 次 |
| 最近记录: |