Python中的动态类级别的提示?

问题描述 投票:0回答:1

[我正在尝试在PyCharm中为特定类动态提供类型提示,这意味着其属性之一在__init__期间分配了一个值,而该值又是一个对象。

我已经尝试为属性定义类级别的类型,但是属性的类型可以是多个类之一,因此我不能真正指向特定类型,但是我希望能够具有自动-完成该属性。

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的自动完成算法),也没有在其中开发任何插件这个方向。

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

python python-3.x plugins autocomplete pycharm
1个回答
0
投票

考虑使用类型提示:

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进行参数化的类。

通过将dynamics标记为T,我们指定了在何处获得T的准确值。

[Union[str, T]表示valuesstrT

请参见PEP-484以获取更多详细信息。

© www.soinside.com 2019 - 2024. All rights reserved.