namedtuple
创建通常需要输入两次名称,一次提供包含新类的模块级变量的名称,一次设置新类的__name__
属性(用于打印输出类对象,我认为主要用于调试,日志记录等)。创建namedtuple时避免输入两次名称
使用函数(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夸德里指出,进口量将会失败。这不好。因此,让我重述一下我的问题:最好的办法是什么?或者它不值得吗?
突变全局名称空间会导致陷阱和有趣的调试......如果我有一个名为'Point'的类在范围内 - 这会摧毁它 - 并隔离范围,为什么突然停止工作将是有趣的你的'new_namedtuple'甚至可能不会运行,这意味着运行时间行为将变得怪异。 –
@JonClements同意。虽然严格地说,对于'Point = namedtuple('Point','x y')'可以这么说:这行代码有时可能只运行,因此偶尔但并非总是会破坏先前定义的'class Point'那意外地有相同的名字)。 – max
我不喜欢它。避免重复的更好方法是使用元类。 – wim