gpt4 book ai didi

python - 如何在 PyCharm 中使用元编程支持动态类型提示?

转载 作者:行者123 更新时间:2023-11-28 18:59:26 26 4
gpt4 key购买 nike

在PyCharm中,类型提示可以正确支持标准库dataclass。但是,当我对 mydataclass 使用相同的实现时,PyCharm 无法支持:

from dataclasses import dataclass
from typing import Tuple, Dict, TypeVar

_C = TypeVar('_C', bound=type)


class TestORM(type):
def __new__(cls, clsname: str, bases: Tuple, clsdict: Dict):
param = ""
for key, key_type in clsdict.get('__annotations__', {}).items():
param += f", {key}: {key_type.__name__} = {clsdict.get(key)}"
clsdict['__init__'] = make_init(param)
return super().__new__(cls, clsname, bases, clsdict)


@dataclass
class Test:
a: int = 0


def mydataclass(cls: _C) -> _C:
param = ""
for key, key_type in cls.__annotations__.items():
param += f", {key}: {key_type.__name__} = {getattr(cls, key)}"
setattr(cls, "__init__", make_init(param))
return cls


def make_init(param:str):
locals = {}
txt = f'def __init__(self{param}):\n pass'
exec(txt, None, locals)
return locals['__init__']


@mydataclass
class MyTest:
a: int = 0

class MyORMTest(metaclass=TestORM):
a: int = 0

if __name__ == '__main__':
Test(a='a')
MyTest(a='a')
MyORMTest(a='a')

The actual result in PyCharm

我该怎么做才能使 PyCharm 类型提示起作用?

总而言之,我只想知道 PyCharm 如何在没有任何与自定义类相关的 stub 文件的情况下使用带有 dataclass 的自定义类。当我使用与 dataclass 相同的实现和 exec 来使我的 __init__ 函数动态时,我仍然无法获得正确的类型提示。

PyCharm 是否对特定的库进行一些特定的解析或检查?

最佳答案

Python 是一种动态语言。这意味着对象可以是任何东西,并且可以在运行时进行转换。

某些功能,如类型提示,通过静态分析工作 - Pycharm 工具链确实包含一些类型提示功能,这些功能也可以通过静态分析检查 Python 自己的数据类。静态分析意味着:它不处理“实时”数据 - 它是通过查看代码并检查与语言分开学习的规则子集来完成的。

简而言之:Pycharm 使用的工具没有可能的机制可以推断任意动态代码的类型提示。这是不可能的。

如果您正在创建一个广泛的框架,您绝对希望在 IDE 中为其提供静态类型提示,则您将必须获取 IDE 本身使用的工具的源代码(我不确定数据类的类型是否提示由 mypy 本身或其他工具完成),并扩展其中一个工具 - 或者创建一个你自己的工具,它将能够以通常的方式自省(introspection)在你的框架中声明的类型那你就申报吧。

否则它就不会发生。

关于python - 如何在 PyCharm 中使用元编程支持动态类型提示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54452809/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com