我可以关闭特定课程的 PyCharm 自动完成功能吗

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

Pycharm 中的 Python 有没有办法表明我不希望在自动完成窗口中向用户显示特定类的类型提示?

我有一个类

Result
可能包含一个字符串,例如
1+2
或另一个类的实例
Exercise
Exercise
类包含 2 个数字,可以从中生成练习字符串。

Result
类使用Pydantic(另见脚注)来验证输入为str或
Exercise
类型,所以我必须声明一个类型的联合:

exercise: Union[str, Exercise]

最后,我希望我的代码的未来用户能够获得自动完成建议,仅将属性

exercise
视为
str
并忽略
Exercise
类型。

在屏幕截图中,您可以看到自动完成窗口有针对

str
Exercise
类型的建议。

autocomplete suggests properties and methods for both str and 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('+'))
python pycharm autocomplete python-typing pydantic
1个回答
0
投票

您展示的示例对我来说似乎很奇怪,因为可以说避免

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
的自动完成建议。

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