创建namedtuple时,避免两次输入键入名称

时间:2016-11-18 18:52:42

标签: python namedtuple

namedtuple创建通常需要输入两次名称,一次提供包含新类的模块级变量的名称,一次设置新类的__name__属性(用于打印)在类对象中,我认为主要用于调试,记录等。)

除了稍微出乎意料之外,使用函数(下面的new_namedtuple)来减少样板代码是否有任何缺点?正在使用globals()正确还是应该使用exec?当然,只有当我们希望类名和变量名相同时才会起作用:

>>> from collections import namedtuple
>>> def new_namedtuple(name, *args, **kwargs):
...   globals()[name] = namedtuple(name, *args, **kwargs)
...
>>> new_namedtuple('Point', 'x y')
>>> p = Point(x=1, y=10)
>>> p
Point(x=1, y=10)

编辑:@Moinuddin Quadri指出进口将失败。那不好。所以让我重新解释一下我的问题:最好的方法是什么?或者它不值得吗?

4 个答案:

答案 0 :(得分:5)

在3.6中使用typing.NamedTuple的推荐方法将满足您的请求,但需要使用类型提示。

>>> import re
>>> re.findall(r'(?:^|\S+)\s*', '   foo \tbar    hello world')
['   ', 'foo \t', 'bar    ', 'hello ', 'world']

键入提示会以错误的方式进行。不幸的是,collections.namedtuple并不支持这种用法,手指越过那种变化。

答案 1 :(得分:0)

是的,我看到这里有一些缺点。最大的问题是您无法在其他文件中导入Point()

另一个是查看代码的其他开发人员的可读性。最好使用默认语法(可能是基于意见的,但我认为它是不利的)。

答案 2 :(得分:0)

我能看到的最大缺点是清晰度。

如果我看到这一行:

new_namedtuple('Point', 'x y')

我会惊讶地发现Point现在是变量。

如果有一个特殊的语法可能很清楚,但没有。这个变量是以非常隐式的方式制作的。

Explicit is better than implicit

答案 3 :(得分:0)

最大的缺点将是你的最终用户的混乱(也许下线,它发生)。人们通常不希望函数像这样改变全局范围。

从功能上讲,这没有问题;您可以根据需要修改globals(),它会运行得很好。可以对它进行语义论证;没有两次输入名字是不合理的。