是否可以关闭特定类的PyCharm自动完成功能

vhmi4jdf  于 2022-11-08  发布在  PyCharm
关注(0)|答案(1)|浏览(183)

在Pycharm的Python中,是否有一种方法可以指示我不希望在自动完成窗口中向用户显示特定类的类型提示?

我有一个类Result,它可能包含一个字符串,例如1+2,或者另一个类Exercise的示例。Exercise类包含2个数字,可以从它们生成一个练习字符串。
Result类使用Pydantic (另请参见脚注) 来验证输入是str还是Exercise类型,因此我必须声明一个类型的Union:

exercise: Union[str, Exercise]

最后,我希望我的代码的未来用户能够获得自动完成建议,即只将属性exercise视为str,而忽略Exercise类型。
在屏幕截图中,您可以看到自动完成窗口中有针对strExercise类型的建议。

所以我的问题是:在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('+'))
8yoxcaq7

8yoxcaq71#

您展示的示例在我看来很奇怪,因为可以认为避免使用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('+'))

输出量:
该验证程序只会将Exercise示例转换为str。其他类的示例将保持不变。pre=True将导致在其他验证之前调用此验证程序。exercise字段将是str而不是Union,并且任何IDE都只会显示str的自动完成建议。

相关问题