假设我有一个对象
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