我想输入提示以下功能:
def get_obj_class(self) -> *class*:
return self.o.__class__
self.o
可以是任何类型,它是在运行时确定的。
*class*
显然不是这里的答案,因为它的语法无效。但 正确的答案是什么?我找不到任何关于此的文档,感谢任何帮助。
在类似的说明中,如果我有一个返回f(cls: *class*)
实例的函数cls
,是否有办法正确键入提示返回值?
答案 0 :(得分:6)
我建议使用TypeVar
的组合来表示您的self.o
值可以是任意类型,Type
,以下列方式:
from typing import TypeVar, Type
T = TypeVar('T')
class MyObj:
def __init__(self, o: T) -> None:
self.o = o
def get_obj_class(self) -> Type[T]:
return type(self.o)
def accept_int_class(x: Type[int]) -> None:
pass
i = MyObj(3)
foo = i.get_obj_class()
accept_int_class(foo) # Passes
s = MyObj("foo")
bar = s.get_obj_class()
accept_int_class(bar) # Fails
如果您希望o
的类型更具动态性,则可以明确地或隐含地为其指定Any
类型。
关于你的后一个问题,你可以这样做:
def f(cls: Type[T]) -> T:
return cls()
请注意,在实例化课程时需要小心 - 我不记得Pycharm在这里做了什么,但我知道mypy目前没有检查以确保你正在调用你的{{ 1}}正确运行/使用正确数量的参数。
(这是因为T可能是任何东西,但是没有办法暗示构造函数应该是什么样子,因此执行此检查最终会变得不可能或非常困难。)
答案 1 :(得分:1)
我认为这可以做到这一点:
def get_obj_class(self) -> type
return self.o.__class__
答案 2 :(得分:0)
如何输入.Type?
https://docs.python.org/3/library/typing.html#typing.Type
这似乎很合适 - 因为__class_应该总是返回一个类型
是的,这是有效的(甚至Pycharm都没有抱怨:
import typing
def test(t: object) -> typing.Type:
return t.__class__
class Dummy(object):
pass
test(Dummy())
关于你的第二个问题:那应该是通用的:https://docs.python.org/3/library/typing.html#user-defined-generic-types