>> class Map(-6ren">
gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:40:52 27 4
gpt4 key购买 nike

>>> 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__来自 parent ?

最佳答案

我不知道为什么,但是map.__new__特别only rejects keyword arguments如果实例化的类是 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
...
我能够追踪到这个代码的最远的地方是 this merge ,其中包括一个更改,当此版本的 map 返回时,将这样的检查添加到一堆 itertools 类型中。还在 itertools.imap .提交消息之一是“错误#1486663:不要拒绝内置类型子类的关键字参数。”,这似乎是指来自旧(现已消失?)跟踪器的错误,但不清楚为什么拒绝关键字参数曾经被认为是一个错误 - 如果子类想要采用父类(super class)不采用的关键字参数,他们不应该将这些参数转发给父类(super class) __new__ .

关于python - 为什么子类化会改变 __init__ 签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66247735/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com