2012-07-07 67 views
7

昨天我正在阅读collections.py的源代码。将属性重命名为_property的原因

namedtuple函数中,会生成template字符串,然后exec用临时名称空间编辑。

在命名空间字典中,property被重命名为_propertytuple_tuple

我想知道背后的原因是什么。这种重命名有什么问题有助于避免?

回答

9

通常,下划线名称有时用于标准库中以保持名称空间的干净。

在_tuple的情况下,因为你被允许使用“元组”作为字段名,有必要:

>>> Example = namedtuple('Example', ['list', 'tuple', 'property']) 
>>> e.list 
[10, 20, 30] 
>>> e.tuple 
(40, 50, 60) 
>>> e.property 
'Boardwalk' 
+2

@JBernardo,你知道RH是Python核心开发人员之一吗?我的意思是说,他可能对此有错,但我怀疑他是从经验中发言的。 – senderle 2012-07-07 01:55:55

+4

这是真的,我是* namedtuple * :-)的代码的作者 – 2012-07-07 01:57:20

+0

所以我不是说我想要“与”,“as”和“除了”作为字段名吗? :) – 2012-07-07 01:58:45

0

它避免了关键字名称冲突。

说我们具有['when', 'who', 'why', 'where', 'with']

即一个假想的列表。如果没有口译人员的话,就不能输入my_name_tuple.with

彻底阅读namedtuple上的文档,你应该明白。

+0

在Python2.7中,您可以设置'rename = True'像'with'这样的无效名称将会替换为'_4'。哎呀,不会影响像在类定义上下文中执行的'x = property(...)'这样的语句。 – satoru 2012-07-07 02:00:41