在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
?
1条答案
按热度按时间brccelvz1#
你好吗?
你怎么看待避免“动态定义的命名元组”?这会导致我们的代码完全混乱
我认为你应该使用数据类,或者,如果你关注命名元组,从
typing
子类化NamedTuple
就像这样: