我应该在哪里定义Python中的namedtuple类 - 哪个名称空间?

时间:2016-05-07 13:55:39

标签: python pickle namedtuple

Namedtuples在Python中用于命名小型数据集合。

以这个名称为例:

import collections
sesameEpisodeNTC = collections.namedtuple('sesameEpisodeNTC', 
                                          'lead_character', 'has_elmo')
se0 = sesameEpisodeNTC(lead_character='bigbird', has_elmo=False)

可以将类定义('sesameEpisodeNTC ='...)作为另一个类的属性吗?我更喜欢在类中保留一些命名元组,以避免混淆模块命名空间。但这会导致酸洗(cPickle,dill)问题,这是一个显而易见的问题。

同样,我注意到了namedtuple类定义的第一个参数,typename(即'sesameEpisodeNTC')必须是类的名称,否则pickle不起作用。 (同时使用2.7和3.4)复制并不理想。是否有其他类型参数的最佳实践,它是否会影响酸洗代码旁边的代码?

是否还有其他未被广泛记录的角落案例,我在命名元组中缺少?令人讨厌的是,一些python最有用的数据结构有尖锐的角落,可以阻碍stdlib的某些部分。

1 个答案:

答案 0 :(得分:1)

如果在模块级别进行namedtuple定义,dill可以使用namedtuple类对象作为属性来挑选类。当然,这并不能帮助你减少混乱。我认为答案是肯定的。目前,您无法在类中定义namedtuple并默认情况下进行腌制。

>>> import collections
>>> nt = collections.namedtuple('nt',['one','two'])
>>> nt
<class '__main__.nt'>
>>> 
>>> import dill
>>> 
>>> dill.copy(nt)
<class '__main__.nt'>
>>> 
>>> class Foo(object):
...   cnt = nt
... 
>>> f = Foo()
>>> f.cnt
<class '__main__.nt'>
>>> f.cnt(1,2)
nt(one=1, two=2)
>>> 
>>> dill.copy(f)
<__main__.Foo object at 0x10f1b5850>
>>> dill.copy(Foo)
<class '__main__.Foo'>
>>> 

dill github上有一张票/题可以做得更好,但现在没有 - 你必须和模块级namedtuples一起生活 - 是的,它们需要与namedtuple的第一个参数同名。