首页 > 编程问答 >我可以关闭特定课程的 PyCharm 自动完成功能吗

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

时间:2024-07-24 15:55:49浏览次数:9  
标签:python pycharm autocomplete python-typing pydantic

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('+'))

很遗憾,PyCharm 目前没有办法从自动完成中排除特定的联合类型。自动完成功能会利用所有可用的类型信息,而希望隐藏该信息的用例则不常见。

不过,可以通过以下几种方法来解决此问题:

  1. 使用类型提示注释替代: 与其试图从自动完成中抑制 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 类型,自动完成也会优先建议字符串方法。

  1. 自定义 __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 类型。

  1. 使用类型别名: 创建一个新的类型别名,表示希望用户如何使用 exercise 属性。例如:

```python from typing import Union

StrOrExercise = Union[str, Exercise]

class Result(BaseModel): exercise: StrOrExercise

```

但这并不会隐藏 Exercise 的自动完成建议,因为它仍然是 StrOrExercise 联合类型的一部分。

请注意,这些方法并不能完全从自动完成中“删除” Exercise 类型提示。它们只是提供了一种方法,使其更方便地将 exercise 属性视为字符串,并使自动完成更侧重于字符串操作。

标签:python,pycharm,autocomplete,python-typing,pydantic
From: 73221819

相关文章

  • 比较Python中的字符串统一特殊字符
    也许我可以使用更好的英语,但我想要的是忽略单词中的重音(和类似的),所以:renè、rené、rene'和rene应该是相同的,所以应该mañana和manana或even-distribuited和evendistribuited,可能还有sho......
  • 如何使用 Python 脚本从客户账单电子邮件中获取订单 ID - WooCommerce API
    我想创建一个python脚本,返回只知道客户的账单电子邮件的订单。我尝试这样做,但返回所有最近的订单:fromwoocommerceimportAPIwcapi=API(url="https://siteexample.com",consumer_key="ck_xxx",consumer_secret="cs_xxx",version="wc/v3")......
  • python基础理论小总结
    1.python语言的特性Python是一门解释型语言,简单清晰,开源免费,跨平台,有大量第三方库辅助开发,支持面向对象与自动垃圾回收,方便与其他编程语言相互调用。Python在数据采集、人工智能、WEB后台开发、自动化运维、测试等方向应用广泛。2.解释型语言和编译型语言的区别执行方式不......
  • python编码规范
    本篇讲的是代码格式化的问题,解决格式化的方法在最下方,不想看内容的,滑到最下方就好了。一、变量的命名规则1.组成:字母、数字、下划线2.不可以以数字开头3.不建议使用下划线开头4.命名需见名知意5.不要与关键字重名。如何查找所有关键字?importkeywordprint(keyword.k......
  • Python爬虫开发中的常用库与框架安装指南
    在Python爬虫开发中,选择合适的库和框架可以大大提高开发效率和爬虫的性能。本文将介绍一些常用的解析库、请求库、储存库、Web库、App爬取库以及爬虫框架,并展示如何使用pip命令进行安装。一、解析库1.BeautifulSoupBeautifulSoup是一个用于从HTML或XML文件中提取数据的Pyth......
  • 如何在Python中的指定项目之后添加新项目到嵌套列表?
    给定的列表是这样的。list1=[10,20,[300,400,[5000,6000],500],30,40]预期输出是这样的。我知道这是一个非常基本的问题,但我很困惑。输出:[10,20,[300,400,[5000,6000,7000],500],30,40]我希望有人能帮助我解决这个问题。并解释了嵌套列表的插入功......
  • python带界面实现word文档比对功能
    python实现word文档比对的功能较简单,笔者这里将其界面话,可以指定输入比对的文档,相似度,最小相似参数等。输出的结果以word的形式保存,重复部分会标出,基本实现了商业软件的功能。先看界面这里不废话了,直接给出全部源码,觉得好的点个赞。程序打包的话,自己百度。fromtkinterimp......
  • 具有固定字典键的 Python 函数返回类型提示
    我有一个函数返回一个始终具有相同键的字典(通过网络发送并使用json进行“字符串化”)。基本上我的函数看起来像这样:defgetTemps(self)->dict:"""getroomandcputemperaturein°Caswellashumidityin%"""#sendtemperaturerequesttoserve......
  • 在类型提示中使用 Type[class_name] 而不是仅使用 class_name 时,python 未解析的属性
    我想输入提示继承结构,但我不知道如何正确执行。这个想法是函数c可以采用A的任何子类。一些子类具有其他子类没有的属性,并且这些属性不是在父类中定义,而是在子类中定义。函数c检查子类,如果它是正确的,则使用该类的特定属性。在此设置中,PyCharm抱怨该参数不在父类中。from......
  • PyCharm 中的 ndb Google Cloud Datastore 的类型提示丢失
    ndbModel类的实例对象没有类型提示。例如some_datetime不显示任何类型提示。类型提示在其他地方起作用。我是否需要安装专门用于类型提示的东西才能与ndb库一起使用?fromgoogle.cloudimportndbclassMyModel(ndb.Model):some_datet......