Python 2 类型注释 - 如何指定返回类型是特定类的类型或子类型?
Posted
技术标签:
【中文标题】Python 2 类型注释 - 如何指定返回类型是特定类的类型或子类型?【英文标题】:Python 2 type comments - how can I designate that a return type is a type or a subtype of a particular class? 【发布时间】:2016-09-10 21:04:12 【问题描述】:所以:
class A(object): pass
class B(A): pass
def class_factory(letter):
"""rtype : type[A]""" # is this correct ?
if letter == 'A': return A # note no parenthesis ! returns the type, not an instance
elif letter == 'B': return B
raise NotImplementedError
似乎找不到任何文档,搜索相当棘手。
奖励:如何在 python 3.5 的类型提示实现中实现这一点?
【问题讨论】:
试过issubclass(B,A)
?
“指定”是什么意思?每个对象都知道它属于哪个类。
不是答案,但听起来你可以在 A.__new__()
中处理此任务。
你为什么要这样做?
【参考方案1】:
正确的用法是"""rtype: type"""
。您正在指定返回的对象的类型,无论您返回的是 A 还是 B,您返回的实际对象都是 type
的实例。如果您运行以下命令,您可以看到这一点:
class A(object): pass
class B(A): pass
print(type(A))
print(type(A()))
print(type(B))
print(type(B()))
因为您在每种情况下都返回type
,所以返回类型应该是type
。无法指定您返回的 class
对象具有特定属性,因为这些属性不取决于您返回的对象的类型,而是取决于您所返回的类型的特定 instance返回。
【讨论】:
是的,谢谢 - 所以这个案例没有泛型? 正确,因为您返回的两个东西都具有相同的类型(它们都是类)。这就像返回两个Cat
对象,一只名为 Scruffy 的猫和一只名为 Fluffy 的猫:它们都是同一类型的实例。【参考方案2】:
文档字符串中的类型提示未标准化。所以有很多答案。
话虽如此,我想说你的返回类型是一个返回 A 实例的函数。也就是说,一个类是一个返回自身实例的可调用对象。这将是这样的:
(Foo, Bar) -> A
其中Foo
和Bar
是函数参数的类型。
【讨论】:
嗯,很有趣 - 你的意思是A.__init__()
中的参数类型?【参考方案3】:
不知道你到底想在这里实现什么,但这样的事情会有所帮助..
>>> class A(object):
pass
>>> class B(A):
pass
>>> def test(letter):
if isinstance(letter,A):
Do something if letter is of object A
elif isinstance(letter,B):
Do something if letter is of object B
【讨论】:
以上是关于Python 2 类型注释 - 如何指定返回类型是特定类的类型或子类型?的主要内容,如果未能解决你的问题,请参考以下文章
如何为 Mypy 类型注释指定 OrderedDict K,V 类型?