为什么子类化会改变 __init__ 签名?

no *_*nek 12 python

>>> 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__从父母那里继承吗?

use*_*ica 6

我不知道为什么,但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__