繁体   English   中英

如何为参数定义类型提示(参数的值是一个类,所有期望值是某个类的子类)?

[英]How to define a type hint to a argument (the argument's value is a class, all expected value is a subclass of a certain class)?

我想定义一个函数。 它有一个参数,其值是一个类。 但并非所有类都可以预期,只能传递某个类的某些子类。

我不知道是否可以使用类型提示来达到这一期望。

如果可以,我该怎么办?

据我所知,类型提示仅在需要值是某些类型的实例时才有用。 而且相关文档确实很差。

class MyClass(object):
    pass

def my_function(arg):
    # arg should be the subclass of MyClass.
    return

我只希望my_function的定义产生与类型提示功能相同的效果(唯一的区别是普通类型提示显示值是某些类的实例,在这里我希望显示值是某些类的子类)。

如果你想说, arg必须是实例 MyClass或某些亚型MyClass ,只是这样做:

class MyClass(object): pass
class Child(MyClass): pass

def my_function(arg: MyClass) -> None:
    pass

my_function(MyClass())  # Type checks
my_function(Child())    # Type checks
my_function(3.14)       # Does not type check

如果您试图说arg必须是MyClass类对象或子类型,请使用typing.Type

from typing import Type

# ...snip...

def my_function_2(arg: Type[MyClass]) -> None:
    pass

my_function_2(MyClass)    # Type checks
my_function_2(Child)      # Type checks
my_function_2(int)        # Does not type check
my_function_2(MyClass())  # Does not type check

当然,类型检查器将无法准确分辨出函数本身恰好在使用哪个子类型。

类型提示仅在要求值是某种类型的实例时才有帮助。

实际上,这不是您可以执行的操作。 不可能构造一个类型提示来断言某个值必须恰好是一个类型,而绝不能是该类型的任何子类型(尽管您通常可以使用泛型来模拟一些近似的东西)。

类型提示始终指示某个值是该类型的实例或某个子类型。

而且相关文档确实很差。

如果尚未找到mypy文档 ,您可能会发现它们很有用。

Mypy是符合PEP 484的静态类型检查器,是与PEP 484本身并行开发的。 (例如,核心的mypy开发人员是编写PEP 484和其他几个与打字相关的PEP的人员。)

结果是mypy的文档通常比Python官方文档更有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM