繁体   English   中英

(任何)类的Python类型提示

[英]Python type hint for (any) class

我想输入提示以下函数:

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

self.o可以是任何类型,它是在运行时确定的。

*class*显然不是这里的答案,因为它是无效的语法。 但是,什么正确的答案? 我找不到任何关于此的文档,任何帮助表示赞赏。


在类似的说明中,如果我有一个返回cls实例的函数f(cls: *class*) ,有没有办法正确键入提示返回值?

我建议使用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当前没有检查以确保你正确调用__init__函数/使用正确的数量PARAMS。

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

我认为这会做的工作:

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

怎么样打字。类型?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM