python 中的动态 class 级别类型提示?

Dynamic class level type hints in python?

我正在尝试在 PyCharm 中为特定的 class 动态提供类型提示,这意味着它的一个属性在 __init__ 期间已分配了一个值,轮到它了是一个对象。

我试过为属性定义一个 class 级别类型,但是属性的类型可能是多个 class 之一,所以我不能真正指向特定的类型,但我希望能够自动完成该属性。

class Dynamic:
    def __init__(self):
        self.field1 = "field1"
        self.field2 = "field2"


class Reusable:
    def __init__(self, dynamics=None):
        if dynamics:
            self.values = dynamics
        else:
            self.values = "nothing"


dynamic_test = Dynamic()
test = Reusable(dynamics=dynamic_test)
print(test.values.)  # this is the place where auto-complete should take place

显然,自动完成不会发生。 我尝试了类似于

class Reusable:
    value_type = str  # type to-be-modified later
    values: value_type

    def __init__(self, dynamics=None):
        if dynamics:
            self.values = dynamics
        else:
            self.values = "nothing"
        Reusable.value_type = type(self.values)  # doesn't actually modify that so I won't have auto-complete based on type

我知道有一些可能性涉及处理内置 __dir__ 函数,但是我也没有得到任何运气(不确定是否依赖于 PyCharm 的自动完成算法或不),也没有朝这个方向开发任何插件。

在这种情况下,有什么办法可以解决这个问题并拥有自动完成功能吗?

考虑使用类型提示:

from typing import Generic, TypeVar, Union

T = TypeVar("T")


class Reusable(Generic[T]):
    values: Union[str, T]

    def __init__(self, dynamics: T = None):
        if dynamics:
            self.values = dynamics
        else:
            self.values = "nothing"

这里我们将 Reusable 标记为可以用 T 参数化的 class。

通过将 dynamics 标记为 T,我们指定了从何处获取 T 的确切值。

Union[str, T] 表示 valuesstrT.

有关详细信息,请参阅 PEP-484