[英]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.