动态创建方法的类型提示

问题描述 投票:0回答:1

在 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
类似?

python pycharm python-typing
1个回答
-5
投票

您对避免“动态定义的命名元组”有何看法?这可能会导致我们的代码完全混乱。

我认为你应该使用数据类,或者,如果你专注于命名元组,则从

NamedTuple
子类
typing

类似这样的:

from typing import NamedTuple

class Foo(NamedTuple):
  bar: int

foo = Foo(5)
© www.soinside.com 2019 - 2024. All rights reserved.