pycharm 动态创建方法的类型提示

avkwfej4  于 2023-01-09  发布在  PyCharm
关注(0)|答案(1)|浏览(169)

在PyCharm中编写Python脚本时,如果我创建一个命名元组,如下所示:

from collections import namedtuple
nt = namedtuple('my_named_tuple', ('a', 'b', 'c'))
x = nt(1, 2, 3)

如果我省略了任何必需的参数(在创建namedtuple时指定),PyCharm会识别出这一点并在代码中突出显示:

同样,如果我添加太多参数:

我想知道这是如何实现的。它是可以在代码中实现的吗?如果可以,又是如何实现的?或者仅仅是因为PyCharm知道为一个命名元组找到正确的参数数量吗?
如果我用可变数量的__init__参数创建自己的动态类型,那么我在PyCharm中就不会得到这种效果,至少不会像我现在这样,例如:

def my_dynamic_type(name: str, args: tuple[str, ...]):
    exec(f'def __init__({", ".join(("self",) + args)}): ...')
    return type(name, (), {'__init__': locals()['__init__']})

mdt = my_dynamic_type('my_type', ('a', 'b', 'c'))

mdt(1, 2, 3)  # works

# WRONG NUMBER OF ARGS BUT NO HIGHLIGHTING:
mdt(1, 2, 3, 4)  # TypeError: __init__() takes 4 positional arguments but 5 were given
mdt(1, 2)  # TypeError: __init__() missing 1 required positional argument: 'c'

有没有什么方法可以在Python中创建一个自定义类型,当在PyCharm中输入代码时,它将被视为类似于namedtuple

brccelvz

brccelvz1#

你好吗?
你怎么看待避免“动态定义的命名元组”?这会导致我们的代码完全混乱
我认为你应该使用数据类,或者,如果你关注命名元组,从typing子类化NamedTuple
就像这样:

from typing import NamedTuple

class Foo(NamedTuple):
  bar: int

foo = Foo(5)

相关问题