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

其中FooBar 是函数参数的类型。

【讨论】:

嗯,很有趣 - 你的意思是 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 类型?

如何注释返回类型取决于其参数的函数?

从用mypy注释的python函数返回None,多种返回类型

返回 lambda 的函数的类型注释

Python3数据类型转换&注释

当一个函数无返回值时,函数的类型应定义为啥