在Python中创建一个namedtuple时,为什么必须提供typename作为第一个参数

时间:2015-05-29 17:30:57

标签: python python-2.7

在collections.namedtuple()构造函数中,第一个参数是您要创建的类型的名称,但据我所知,除了诊断消息之外,它是无关紧要的。

from collections import namedtuple
Point = namedtuple('Point', 'x y')
p = Point(1,2)   # works fine, creates Point(x=1, y=2)

Point = namedtuple('blah', 'x y')
p = Point(2,3)   # works fine, creates blah(x=1,y=2)

这只是程序员为诊断目的而保持一致的必要项目,因为Python没有办法学习你将namedtuple分配给的变量的名称吗?似乎容易出错,但我可以看到它是如何必要的。只是想知道是否有任何其他原因或影响这两个名称不匹配。

1 个答案:

答案 0 :(得分:4)

命名元组以一种肮脏的方式实现。有一个模板字符串有一些占位符,当你调用namedtuple()时,实际上会发生这些占位符被参数替换而模板是eval'd。这个实现看起来很脏(因为它使用了eval)但是非常简单和强大。

缺点是实际需要一个类名,因为其中一行实际上就是这样:class {typename}(tuple):。因此,您需要为其指定类型名称。

至于该名称的值,它并不重要,但正如您所说,出于调试目的,选择与包含该类型的变量同样使用的相同名称也很有用。否则,整件事情就不会有太大的不同了:

class CustomType:
    …

# assign a new name, and never talk about CustomType again
NewName = CustomType