我想定义一个函数。它有一个参数,其值是一个类。但并非所有类都是预期的,只能传递某个类的某些子类。
我不知道是否可以使用类型提示来实现此期望。
如果是这样,我该怎么做?
据我所知,类型提示只有在要求值是某种类型的实例时才有帮助。而且相关文档真的很差。
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文档更有用。