[我正在尝试在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的自动完成算法),也没有在其中开发任何插件这个方向。
在这种情况下,有什么办法可以解决这个问题并具有该自动完成功能吗?
考虑使用类型提示:
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以获取更多详细信息。