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



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

我不知道是否可以使用类型提示来实现此期望。

如果是这样,我该怎么做?

据我所知,类型提示只有在要求值是某种类型的实例时才有帮助。而且相关文档真的很差。

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

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

如果你想说arg必须是MyClassMyClass的某个子类型的实例,只需这样做:

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文档更有用。

最新更新