【问题标题】:Python 2 type comments - how can I designate that a return type is a type or a subtype of a particular class?Python 2 类型注释 - 如何指定返回类型是特定类的类型或子类型?
【发布时间】: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__() 中处理此任务。
  • 你为什么要这样做?

标签: python python-2.7 type-hinting


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-13
    • 2022-11-15
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多