在 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
类似?
您对避免“动态定义的命名元组”有何看法?这可能会导致我们的代码完全混乱。
我认为你应该使用数据类,或者,如果你专注于命名元组,则从
NamedTuple
子类 typing
。
类似这样的:
from typing import NamedTuple
class Foo(NamedTuple):
bar: int
foo = Foo(5)