Python 3.x 从“typing.tuple”派生时,如何初始化基“tuple”?
根据“内置泛型类型..作为类型和基类都有效。”它给出了一个派生自Python 3.x 从“typing.tuple”派生时,如何初始化基“tuple”?,python-3.x,type-hinting,Python 3.x,Type Hinting,根据“内置泛型类型..作为类型和基类都有效。”它给出了一个派生自Dict[str,List[Node]]的示例 但是,当我尝试使用Tuple[int,int]时,构造函数没有正确地转发。例如: from typing import Tuple class MyTuple(Tuple[int, int]): def hello(self): print("hello: " + str(len(self))) MyTuple([1, 2]).hello() 打印你好:0
Dict[str,List[Node]]
的示例
但是,当我尝试使用Tuple[int,int]
时,构造函数没有正确地转发。例如:
from typing import Tuple
class MyTuple(Tuple[int, int]):
def hello(self):
print("hello: " + str(len(self)))
MyTuple([1, 2]).hello()
打印你好:0
。如果我从内置的元组派生,它将打印hello:2
当从tuple[int,int]
派生时,如何初始化基本tuple
对象?在键入
模块中的类型实际上并不意味着直接实例化:它们应该在注释中用作静态类型提示
但如果确实需要,可以重写\uuuuu new\uuuu()
以返回元组:
class MyTuple(Tuple[int, int]):
def __new__(cls, *args, **kwargs):
return tuple(*args, **kwargs)
print(MyTuple('abc')) # -> ('a', 'b', 'c')
这将在每次调用MyTuple()
时创建普通元组对象。如果希望对象成为类的实例:
class MyTuple(Tuple[int, int]):
def __new__(cls, *args, **kwargs):
return tuple.__new__(cls, *args, **kwargs)
print(MyTuple('abc')) # -> ('a', 'b', 'c')
print(type(MyTuple('abc'))) # -> __main__.MyTuple
这是因为typing.Tuple
是Tuple
的子类
请注意,调用super()。\uuuu new\uuuu()
将不起作用,因为typing.Tuple
(和其他泛型类型)会丢弃传递给它们的参数。您必须通过直接调用tuple来“短路”。\uuu new\uuu()
。谢谢。当然,指定泛型基类的类型是一个关键问题,但是我链接和引用的文档非常清楚地表明,从内置泛型类型派生是应该做的。如果我直接从tuple派生,mypy会抱怨我的tuple的元素属于Any类型。谢谢你建议我使用\uuuuu new\uuuuuu
,我没有想到这一点。然而,在我的用例中,我添加了方法和其他字段;如果我让\uuuuu new\uuuuu
返回一个元组,而不是我的类的一个实例,那么这就不起作用了。还有其他建议吗?