>>> map(int, ["1", "2"], kw=True)
TypeError: map() takes no keyword arguments
Run Code Online (Sandbox Code Playgroud)
但是当子类化时
>>> class Map(map):
... pass
...
>>> Map(int, ["1", "2"], whydoesthiswork=True)
<__main__.Map at 0x10fe48700>
Run Code Online (Sandbox Code Playgroud)
为什么现在接受关键字参数?它不应该只是__init__
从父母那里继承吗?
我不知道为什么,但map.__new__
特别是如果被实例化的类map
本身是拒绝关键字参数:
if (type == &PyMap_Type && !_PyArg_NoKeywords("map", kwds))
return NULL;
Run Code Online (Sandbox Code Playgroud)
这基本上相当于 C 级
def __new__(cls, *args, **kwargs):
if cls is map and kwargs:
raise TypeError
...
Run Code Online (Sandbox Code Playgroud)
我能够追踪此代码的最远的地方是此 merge,其中包括一个更改,该更改在此版本map
仍为itertools.imap
. 提交消息之一是“错误#1486663:不要拒绝内置类型子类的关键字参数。”,这似乎是指来自旧(现已消失?)跟踪器的错误,但不清楚为什么拒绝关键字参数曾经被认为是一个错误 - 如果子类想要采用超类不采用的关键字参数,他们不应该将这些参数转发给超类__new__
。