我正在尝试在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的自动完成算法),或者任何插件都没有是朝这个方向发展的。
在这种情况下,有什么办法可以解决这个问题并具有该自动完成功能吗?
答案 0 :(得分: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]
表示values
是str
或T
。
有关更多详细信息,请参见PEP-484。