首页 > 编程问答 >VSCode 的 Python 扩展中更详细的属性提示

VSCode 的 Python 扩展中更详细的属性提示

时间:2024-07-29 16:12:24浏览次数:9  
标签:python visual-studio-code code-hinting

假设我有一个对象 args parser.parse_args() 返回,并且它 应该 具有像 args.port = 6001 args.seed = 1234 这样的属性。当我在 VSCode 中按 args. 时, port seed 不会显示在建议的属性列表中,因为这些属性可能会在运行时发生变化。然而,代码可能已经在某个地方使用了 args.port args.seed ,所以应该清楚,至少在这个范围内, args 具有属性 port seed 尽管访问这些属性不是 100% 安全,VSCode 可以将它们添加到属性列表中并指示它们 可能 存在,而不是根本不显示它们。有没有简单的方法来调整 VSCode 或 Python 扩展来支持此功能?或者,如果其他 IDE 支持此功能,我可能会考虑切换到该 IDE。

P.S.为什么这是必要的?假设我正在修改别人的代码,并且该程序有大量的命令行参数,这要求参数名称相当长,所以再加上一些奇怪的缩写,我可能需要查找解析器的定义来确定每次使用 args 的哪个属性。这非常乏味。

P.S.还有一些其他的方法,比如定义一个类(比如 MyClass )来指定属性并写 args: MyClass = parser.parse_args() 但这也是一项繁琐的工作,特别是当解析器没有配置多个 parser.add_arugment 语句而是由分散在多个Python文件中的多个委托类配置时,在这种情况下我需要仔细读取所有这些文件来组成一个属性列表。


你所描述的是Python动态语言特性带来的挑战之一。VSCode以及其他IDE的代码分析工具主要依赖于静态分析,这在处理像 argparse Namespace 对象这样运行时动态生成属性的对象时会遇到困难。

以下是几种可能的解决方法,以及它们各自的优缺点:

1. 使用类型提示:

  • 优点: 最佳实践,提高代码可读性和可维护性。
  • 缺点: 需要修改原有代码,对于大型项目或他人代码库来说可能工作量较大。

你可以使用 argparse 模块的 ArgumentParser.parse_known_args 方法,并结合 typing.NamedTuple dataclasses.dataclass 来定义参数类型。

```python from typing import NamedTuple import argparse

class Arguments(NamedTuple): port: int seed: int

parser = argparse.ArgumentParser() parser.add_argument('--port', type=int, default=6001) parser.add_argument('--seed', type=int, default=1234)

args, _ = parser.parse_known_args()

args: Arguments = Arguments(**vars(args)) ```

这样,VSCode 就能识别 args 的类型为 Arguments ,并提供正确的属性提示。

2. 使用文档字符串:

  • 优点: 简单易行,不需要修改代码逻辑。
  • 缺点: IDE支持程度不一,需要遵循特定的文档格式。

你可以在 parser.parse_args() 返回值后添加文档字符串,明确指出可能的属性和类型。

python args = parser.parse_args() """ :type args: argparse.Namespace :ivar port: 端口号 :vartype port: int :ivar seed: 随机种子 :vartype seed: int """

一些IDE和插件(如PyCharm)能够识别文档字符串中的类型信息,并提供代码补全。

3. 使用自定义类型存根文件:

  • 优点: 无需修改原有代码,对特定库提供更精确的类型信息。
  • 缺点: 需要一定的配置,维护成本较高。

你可以创建 *.pyi 类型存根文件,为 argparse.Namespace 对象定义更具体的类型信息,VSCode 会加载这些文件以提供更准确的代码分析。

4. 使用 "Monkey patching" 动态修改类:

  • 优点: 灵活,可以针对特定情况定制代码提示。
  • 缺点: 潜在风险,可能导致不可预料的错误,不推荐在生产环境使用。

你可以在代码运行时动态地为 argparse.Namespace 对象添加属性提示信息。

```python import argparse

def getattr (self, name): ... # 处理属性访问逻辑

argparse.Namespace. getattr = getattr

args = parser.parse_args() ```

请谨慎使用此方法,因为它可能会影响代码的行为。

其他IDE:

除了 VSCode,其他 IDE 如 PyCharm 也提供了丰富的代码分析和类型推断功能,可以更好地处理动态语言特性。你可以尝试使用其他 IDE,看看是否更符合你的需求。

总的来说,没有完美的解决方案可以完全解决动态语言的代码分析问题。建议根据项目的具体情况选择最合适的方案。

标签:python,visual-studio-code,code-hinting
From: 78803315

相关文章

  • 编写用于关键字检测和按钮发送的 Python Telegram 机器人
    我需要帮助用Python为我的Telegram机器人编写代码。我有一个config.py文件,其中包含两个关键字列表:keywords和button_phrases。keywords-负责在单击时显示子按钮的按钮。Button_phrases-负责单击时打开链接的按钮。我需要机器人检查用户输入的文本并按以下顺......
  • Python monorepo 打包,使用 Poetry
    我想将我的Python源代码组织到一个单一存储库中,具有以下基本结构:projectrootdir-libraryone-pyproject.toml-README-src/orgname/libraryone-__init__.py-somemodule.py-webapi-pyproject.toml-README-src/organa......
  • 如何使用Python AST给表达式a == b添加括号?
    请问,有谁知道如何使用PythonAST在代码中为a==b这样的表达式添加括号?我尝试过重写visit_Compare,但是ast.unparse中的delimit_if自动删除了我添加的括号,因为优先级a==b的值更高。你说的对,直接使用ast.unparse会因为优先级问题导致添加的括号被移除。为了解......
  • 使用 powershell 或 python 从网页列出公司名称
    我希望使用PowerShell或python仅列出URL中的公司名称:https://www.moneycontrol.com/markets/earnings/results-calendar/?activeDate=2024-07-29下面是我的python脚本用于获取网页的结构:importrequestsfrombs4importBeautifulSoup#URLo......
  • T3/A40i支持Linux-5.10新内核啦,Docker、Qt、Python统统升级!
    自2021年创龙科技推出全志国产化率100%的T3/A40i工业核心板后,不到两年时间已超过800家工业客户选择创龙科技T3/A40i平台。随着客户产品的不断升级与迭代,部分“能源电力”、“工业自动化”行业客户对T3/A40i的Linux版本提出了更高要求,主要涉及Docker、Qt、Python等组件特性。秉持......
  • 使用 Python 中的多处理防止共享内存中的数据损坏?
    我目前正在开发一个多处理Python程序,其中每个进程将其索引作为连续的4字节整数写入共享内存。并且有一个读取器可以在没有任何锁的情况下读取其他进程的索引。因为我没有使用任何同步原语,所以我担心读取器进程可能会由于逐字节写入内存而读取损坏的数据(例如,一个索引的前2个......
  • Python如何统治AI世界?一文读懂它的优势与挑战
    一、Python语言介绍1.1Python语言概述Python是一种由GuidovanRossum于1991年首次发布的高级编程语言。其设计理念强调代码的可读性和简洁性,使其成为了许多开发者的首选语言。Python的语法简洁直观,采用了缩进来定义代码块,这与其他使用花括号或关键词的编程语言不同。Python......
  • 找到一种方法将program1的输出作为python中program2的输入发送
    有人可以帮我找到一种方法将program1的输出作为python中的program2的输入发送将其保存为.csv文件不会对我有帮助,因为该程序应该尽快执行这些任务。因此我正在寻找一种方法将程序1的终端输出直接发送到程序2在Python中,可以使用子进程模块将一个程序的输出发送到另一个程......
  • 同时运行多个Python程序的最佳方法
    我有一个python程序,我想同时运行多个具有不同参数的实例。这些实例彼此之间不进行通信。在单独的终端中运行每个实例太乏味了。我考虑使用多处理模块将每个实例作为单独的进程运行,但是我希望能够随时停止和重新启动某些单独的实例,而不会中断其他正在运行的实例。是否有任何流程......
  • 替换 Python 数据框中包含值的 <
    我有一个数据框,在某些列中存在诸如“<0.5、<10、<100”等值。如果值仅包含“<”,我想将所有这些值替换为0。我该怎么做?我对Python比较陌生。尝试使用pd.DataFrame.replace()。importpandasaspd#创建示例数据框df=pd.DataFrame({'A':['<0.5','<10',15,20],......