Python 3.6和3.7之间子类的向后不匹配变化

Python 3.6和3.7之间子类的向后不匹配变化,python,tuples,subclass,Python,Tuples,Subclass,Python 3.6 >>> class Tup(tuple): ... pass ... >>> Tup(x=123) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'x' is an invalid keyword argument for this function 3.6和3.

Python 3.6

>>> class Tup(tuple):
...     pass
... 
>>> Tup(x=123)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'x' is an invalid keyword argument for this function

3.6和3.7之间发生了什么变化?为什么呢?

较新版本的Python中的行为是一个bug

版本3.6和3.7之间的变化来自
tuple
如何处理其参数。在3.6及更早版本中,
tuple
的单个可选参数可以按位置传递(正常的、有文档记录的方式),也可以作为关键字参数,使用未文档化的名称
序列

>>> tuple(sequence="ab") # this only works on Python versions prior to 3.7
('a', 'b')
Python3.7删除了将参数作为关键字传递的功能。相反,它变成了一个位置唯一的论点。当时,只有内置函数可以有这种参数,尽管它们的语法在中有文档记录(并且它们在实现的Python3.8中可用于普通Python代码)。在较新版本的Python中,您可以在
tuple
的文档中看到仅位置参数语法,其中参数的性质通过在构造函数签名中添加斜杠(在单个仅位置参数之后)来微妙地指示:

不幸的是,更改的实现似乎对
tuple
子类中的关键字参数的处理产生了一些意外的后果,因为继承的构造函数方法会默默地忽略它传递的所有关键字参数,而不是引发适当的异常(与3.6及之前版本中对除序列以外的任何关键字名称所做的相同)


这个问题已经向Python开发人员报告过了(可能是您?)。一旦确定了纠正这个问题的最佳方法,我希望对于仍在接受bug修复的Python版本(目前是3.8和3.9,但不是3.7,它只得到安全修复),它将得到修复。它可能需要几个月才能发布。

较新版本的Python中的行为是一个bug

版本3.6和3.7之间的变化源于
tuple
如何处理其参数。在3.6和更早版本中,
tuple
的单个可选参数可以按位置传递(正常的、有文档记录的方式),也可以作为关键字参数,使用未文档记录的名称
序列

>>> tuple(sequence="ab") # this only works on Python versions prior to 3.7
('a', 'b')
Python 3.7取消了将参数作为关键字传递的功能。取而代之的是,它变成了一个仅用于位置的参数。当时,只有内置函数可以具有这种参数,尽管它们的语法在中有文档记录(并且它们在Python 3.8中的普通Python代码中已实现)。您可以在较新版本的Python中的
tuple
文档中看到仅位置参数语法,其中参数的性质通过在构造函数签名中添加斜杠(在单个仅位置参数之后)来微妙地指示:

不幸的是,更改的实现似乎对
tuple
子类中的关键字参数的处理产生了一些意外的后果,因为继承的构造函数方法会默默地忽略它传递的所有关键字参数,而不是引发适当的异常(与3.6及之前版本中对除序列以外的任何关键字名称所做的相同)


这个问题已经向Python开发人员报告过了(可能是您?)。一旦确定了纠正这个问题的最佳方法,我希望对于仍在接受bug修复的Python版本(目前是3.8和3.9,但不是3.7,它只得到安全修复),它将得到修复。它可能需要几个月才能发布。

这纯粹是猜测,但最显著的变化似乎是添加了数据类。文档部分包括“函数bool()、float()、list()和tuple()不再采用关键字参数。”在删除的特性部分。我猜这与仅位置参数支持有关?您在元组子类中显示的内容对我来说似乎是一个错误。事实上,它已经存在于Python错误跟踪程序中:这纯粹是一个猜测,但最显著的变化是添加了数据类。文档部分包括“函数bool()、float()、list()和tuple()不再接受关键字参数。”在“已删除的功能”部分。我猜这与仅支持位置参数有关?您在tuple子类中显示的内容对我来说似乎是一个bug。事实上,它已经出现在Python bug跟踪器中:
>>> help(tuple) # in more recent versions of Python
Help on class tuple in module builtins:

class tuple(object)
 |  tuple(iterable=(), /)
[...]