从类型到实例化对象的Python泛型类型提示



我目前在IDE自动完成方面遇到了一些问题,因为它无法判断返回类型等。

我有一个单例元类,覆盖类似于以下的__call__方法:

SingletonTypes = typing.TypeVar("SingletonTypes")

class Singleton(ABCMeta):
def __call__(cls: SingletonTypes, environment: str = None, *args, **kwargs) -> SingletonTypes:
/* code here, will return an instanciated copy of cls */
return super(Singleton, cls).__call__()

我的问题是,如果我有Generic类型提示,而cls显然是一个类型,并且它返回对象。我不知道如何指定类型提示来表明这一点,而不会让python感到困惑。

如果我尝试将type(SingletonTypes)添加到cls typehint中,那么它不会提示任何内容,因为SingletonType之间没有一致性。不太确定如何进行,如果能自动完成,那就太好了。

您尝试过吗:

def __call__(cls: Singleton, environment: str = None, *args, **kwargs) -> SingletonTypes:

从技术上讲,这是正确的:cls是";Singleton";singleton类的元类。但我不确定围绕注释的工具对元类的工作方式有多了解——在某些方面,用于类型提示和注释的工具感觉与语言的实际工作方式脱节。

如果这不起作用,您应该在不使用元类的情况下使用singleton,因为这无论如何都太过分了。除非你需要一个只运行一次的__init__方法,并且不能在__new__中,否则你只需要在类或基类本身的__new__中添加元类‘__call__’中的相同逻辑。由于该机制将使用简单的继承,因此类型提示机制应该可以正常工作,不需要特殊的注释:

class SingletonBase:
def __new__(cls, *args, **kw):
if "_instance" in cls.__dict__:
return cls._instance  # NB: this will still trigger a call to __init__ in subclasses
instance = super().__new__(cls, *args, **kw)
cls._instance= instance
return instance

(我认为,在这种情况下,类型暗示机制甚至可以在没有显式注释的情况下找到自己的方法,因为__new__的角色在语言语义中有很好的定义(

最新更新