如何定义参数的类型提示(参数的值是class,所有预期值都是某个class的子class)?
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。但是并不是所有的classes都可以通过,只能通过某个class的一些subclass。
我不知道是否可以使用类型提示来实现这个期望。
如果是,我该怎么做?
据我所知,类型提示仅在需要值是特定类型的实例时才有用。而且相关文档真的很差
class MyClass(object):
pass
def my_function(arg):
# arg should be the subclass of MyClass.
return
我只是希望my_function的定义产生与类型提示相同的效果(唯一的区别是普通类型提示显示值是某个class的实例,这里我想要它显示值是某些 class).
的子class
如果你想说 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
class 对象或子类型,请使用 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
当然,类型检查器无法准确判断您在函数本身中使用的是哪种子类型。
the type hint can only help when requiring value is a instance of certain type.
这其实不是你能做到的。 不可能 构造一个类型提示来断言某些值必须恰好是一种类型,而绝不能是该类型的任何子类型(尽管您通常可以通过使用泛型来模拟一些接近的东西)。
类型提示总是 表示某个值是该类型的实例或某个子类型。
And the relevant documentation is really poor.
如果您还没有找到 mypy docs,您可能会发现阅读它们很有用。
Mypy 是一个符合 PEP 484 的静态类型检查器,它是与 PEP 484 本身并行开发的。 (例如,核心 mypy 开发人员是编写 PEP 484 和其他几个与打字相关的 PEP 的人。)
结果是 mypy 的文档通常比官方 Python 文档更有帮助。
我想定义一个函数。它有一个参数,其值为 class。但是并不是所有的classes都可以通过,只能通过某个class的一些subclass。
我不知道是否可以使用类型提示来实现这个期望。
如果是,我该怎么做?
据我所知,类型提示仅在需要值是特定类型的实例时才有用。而且相关文档真的很差
class MyClass(object):
pass
def my_function(arg):
# arg should be the subclass of MyClass.
return
我只是希望my_function的定义产生与类型提示相同的效果(唯一的区别是普通类型提示显示值是某个class的实例,这里我想要它显示值是某些 class).
的子class如果你想说 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
class 对象或子类型,请使用 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
当然,类型检查器无法准确判断您在函数本身中使用的是哪种子类型。
the type hint can only help when requiring value is a instance of certain type.
这其实不是你能做到的。 不可能 构造一个类型提示来断言某些值必须恰好是一种类型,而绝不能是该类型的任何子类型(尽管您通常可以通过使用泛型来模拟一些接近的东西)。
类型提示总是 表示某个值是该类型的实例或某个子类型。
And the relevant documentation is really poor.
如果您还没有找到 mypy docs,您可能会发现阅读它们很有用。
Mypy 是一个符合 PEP 484 的静态类型检查器,它是与 PEP 484 本身并行开发的。 (例如,核心 mypy 开发人员是编写 PEP 484 和其他几个与打字相关的 PEP 的人。)
结果是 mypy 的文档通常比官方 Python 文档更有帮助。