(任何)类的 Python 类型提示

新手上路,请多包涵

我想输入提示以下功能:

 def get_obj_class(self) -> CLASS_TYPE:
  return self.o.__class__

  • CLASS_TYPE 应该表示 class es。
  • self.o 可以是运行时确定的任何类型。

同样,如果我有一个函数 f(cls: CLASS_TYPE) 返回一个实例 cls ,有没有办法适当地键入提示返回值?

原文由 yspreen 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 728
2 个回答

我建议使用 TypeVar 的组合,以表明您的 self.o 值可以是任意类型,并且 Type ,026- 方式如下:

 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 目前不会检查以确保您正在正确调用 __init__ 函数/具有正确数量的参数。

(这是因为 T 可以是任何东西,但是没有办法暗示构造函数应该是什么样子,所以执行这个检查最终要么不可能要么非常困难。)

原文由 Michael0x2a 发布,翻译遵循 CC BY-SA 3.0 许可协议

对于 Python >=3.7,使用 type (另见 PEP 585 ):

 def get_obj_class(self) -> type:
    return self.o.__class__

对于 Python <3.7,使用 typing.Type

 def get_obj_class(self) -> typing.Type:
    return self.o.__class__

原文由 VMRuiz 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题