注释需要类对象而不是该类实例的函数参数的正确方法是什么?
在下面的示例中,some_class
argument 应该是一个类型实例(它是一个类),但这里的问题是它type
太宽泛了:
def construct(some_class: type, related_data:Dict[str, Any]) -> Any:
...
在some_class
需要一组特定类型对象的情况下,使用type
根本没有帮助。该typing
模块可能需要一个类泛型来执行此操作:
def construct(some_class: Class[Union[Foo, Bar, Baz]], related_data:Dict[str, Any]) -> Union[Foo, Bar, Baz]:
...
在上面的示例中,是some_class
或类,而不是它的实例。它们在类树中的位置应该无关紧要,因为它也应该是一个有效的案例。所以,Foo
Bar
Faz
some_class: Class[Foo]
# classes are callable, so it is OK
inst = some_class(**related_data)
或者
# instances does not have __name__
clsname = some_class.__name__
或者
# an operation that only Foo, Bar and Baz can perform.
some_class.a_common_classmethod()
对 mypy、pytype、PyCharm 等应该没问题。
如何使用当前的实现(Python 3.6 或更早版本)来做到这一点?