Pycharm 中的 Python 有没有办法表明我不希望在自动完成窗口中向用户显示特定类的类型提示?
我有一个类
Result
可能包含字符串,例如
1+2
或另一个类的实例
Exercise
Exercise
类包含 2 个数字,可以从中生成一个练习字符串。
Result
类使用 Pydantic
(另见脚注)
将输入验证为 str 或
Exercise
类型,所以我必须声明类型的联合:
exercise: Union[str, Exercise]
最后,我希望我的代码的未来用户能够获得自动完成建议,将属性
exercise
视为
str
仅并忽略
Exercise
类型。
在屏幕截图中,您可以看到自动完成窗口对
str
和
Exercise
类型都有建议。
所以我的问题是: Pycharm 中的 Python 有没有办法表明我不需要类型提示在自动完成窗口中向用户显示的特定类的名称?
脚注
-
在示例中,我使用 Pydantic 来定义
Exercise(BaseModel)
来阐明我的观点,但您可以使用Exercise
的其他定义.
代码
from typing import Union
from pydantic import BaseModel
#
# class Exercise:
# def __init__(self, num1: int, num2: int):
# self.num1: int = num1
# self.num2: int = num2
#
# def convert_to_str(self) -> str:
# return f'{self.num1} + {self.num2}'
class Exercise(BaseModel):
num1: int
num2: int
def convert_to_str(self) -> str:
return f'{self.num1} + {self.num2}'
class Result(BaseModel):
exercise: Union[str, Exercise]
def convert_to_str(self):
if isinstance(self.exercise, Exercise):
self.exercise = self.exercise.convert_to_str()
if __name__ == '__main__':
exercise_example: Exercise = Exercise(num1=1, num2=2)
result1: Result = Result(exercise=exercise_example)
print(result1.exercise)
result1.convert_to_str()
print(result1.exercise)
print(result1.exercise.split('+'))
很遗憾,PyCharm 目前没有办法从自动完成中排除特定的联合类型。自动完成功能会利用所有可用的类型信息,而希望隐藏该信息的用例则不常见。
不过,可以通过以下几种方法来解决此问题:
-
使用类型提示注释替代:
与其试图从自动完成中抑制
Exercise
,不如提供一个更明确的类型提示,引导用户使用字符串方法。例如:
class Result(BaseModel):
exercise: Union[str, Exercise] # 保留完整的类型提示以供其他用途
def convert_to_str(self):
if isinstance(self.exercise, Exercise):
self.exercise = self.exercise.convert_to_str()
def __getattr__(self, item):
# 如果 `exercise` 是 Exercise 类型,但尝试访问字符串属性,则将其转换为字符串
if isinstance(self.exercise, Exercise) and hasattr(str, item):
return getattr(self.exercise.convert_to_str(), item)
raise AttributeError(f"'Result' object has no attribute '{item}'")
现在,即使
exercise
是
Exercise
类型,自动完成也会优先建议字符串方法。
-
自定义
__getattr__
: 可以定义一个自定义的__getattr__
方法来控制属性访问。如果exercise
是Exercise
,并且用户尝试访问字符串属性,则将exercise
转换为字符串。
```python class Result(BaseModel): exercise: Union[str, Exercise]
def __getattr__(self, item):
if isinstance(self.exercise, Exercise) and hasattr(str, item):
return getattr(str(self.exercise), item)
raise AttributeError(f"'Result' object has no attribute '{item}'")
```
这将使自动完成建议字符串方法,即使
exercise
当前是
Exercise
类型。
-
使用类型别名:
创建一个新的类型别名,表示希望用户如何使用
exercise
属性。例如:
```python from typing import Union
StrOrExercise = Union[str, Exercise]
class Result(BaseModel): exercise: StrOrExercise
```
但这并不会隐藏
Exercise
的自动完成建议,因为它仍然是
StrOrExercise
联合类型的一部分。
请注意,这些方法并不能完全从自动完成中“删除”
Exercise
类型提示。它们只是提供了一种方法,使其更方便地将
exercise
属性视为字符串,并使自动完成更侧重于字符串操作。