Pycharm 中的 Python 有没有办法表明我不希望在自动完成窗口中向用户显示特定类的类型提示?
我有一个类
Result
可能包含一个字符串,例如1+2
或另一个类的实例 Exercise
。 Exercise
类包含 2 个数字,可以从中生成练习字符串。
Result
类使用Pydantic(另见脚注)来验证输入为str或Exercise
类型,所以我必须声明一个类型的联合:
exercise: Union[str, Exercise]
最后,我希望我的代码的未来用户能够获得自动完成建议,仅将属性
exercise
视为 str
并忽略 Exercise
类型。
在屏幕截图中,您可以看到自动完成窗口有针对
str
和 Exercise
类型的建议。
所以我的问题是:Pycharm 中的 Python 有没有办法表明我不希望在自动完成窗口中向用户显示特定类的类型提示?
脚注
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('+'))
您展示的示例对我来说似乎很奇怪,因为可以说避免
str
并仅使用 Exercise
可以提供更好的面向对象方法。
假设您实际上想要一个
exercise: str
字段,但您想要一种通过将 Exercise
实例转换为 str
来初始化它的方法,您可以使用 @validator
:
from typing import Any
from pydantic import BaseModel, validator
class Exercise(BaseModel):
num1: int
num2: int
def convert_to_str(self) -> str:
return f'{self.num1} + {self.num2}'
class Result(BaseModel):
exercise: str
@validator("exercise", pre=True)
def _convert_exercise(cls, exercise: Any) -> Any:
if isinstance(exercise, Exercise):
return exercise.convert_to_str()
return exercise
if __name__ == '__main__':
exercise_example: Exercise = Exercise(num1=1, num2=2)
result1: Result = Result(exercise=exercise_example)
print(result1.exercise)
print(result1.exercise.split('+'))
输出:
1 + 2
['1 ', ' 2']
该验证器只会将
Exercise
实例转换为 str
。其他类的实例将保持不变。 pre=True
将导致此验证器在其他验证之前被调用。 exercise
字段将是 str
而不是 Union
,任何 IDE 都应该只向您显示 str
的自动完成建议。