繁体   English   中英

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

[英]Why does subclassing change the __init__ signature?

>>> map(int, ["1", "2"], kw=True)
TypeError: map() takes no keyword arguments

但是当子类化时

>>> class Map(map):
...     pass
...
>>> Map(int, ["1", "2"], whydoesthiswork=True)
<__main__.Map at 0x10fe48700>

为什么这现在接受关键字参数? 它不应该只是从父级继承__init__吗?

我不知道为什么,但是map.__new__特别拒绝关键字 arguments如果被实例化的 class 本身是map本身

if (type == &PyMap_Type && !_PyArg_NoKeywords("map", kwds))
    return NULL;

这基本上是 C 级的等价物

def __new__(cls, *args, **kwargs):
    if cls is map and kwargs:
        raise TypeError
    ...

我能够追踪此代码的最远时间是此合并,其中包括一个更改,当此版本的map仍然是itertools.imap时,该更改将此类检查添加到一堆 itertools 类型。 其中一个提交消息是“错误 #1486663:不要拒绝关键字 arguments 用于内置类型的子类。”,这似乎是指来自旧(现已消失?)跟踪器的错误,但不清楚为什么拒绝关键字 arguments 曾经被认为是一个错误 - 如果子类想要采用关键字 arguments 超类不采用,他们不应该将这些 arguments 转发给超类__new__

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM