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

MHH*_*MHH 5 python pickle namedtuple

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

以这个命名元组为例:

import collections
sesameEpisodeNTC = collections.namedtuple('sesameEpisodeNTC', 
                                          'lead_character', 'has_elmo')
se0 = sesameEpisodeNTC(lead_character='bigbird', has_elmo=False)
Run Code Online (Sandbox Code Playgroud)

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

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

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

Mik*_*rns 4

如果您namedtuple在模块级别进行定义,则可以使用类对象作为属性来dillpickle该类。namedtuple当然,这并不能帮助你“减少混乱”。我想答案是否定的。目前,您无法namedtuple在类中定义 a 并默认对其进行 pickle。

>>> 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'>
>>> 
Run Code Online (Sandbox Code Playgroud)

github上有一个票证/问题dill可以做得更好,但现在不行——你必须忍受模块级别namedtuples——是的,它们需要与namedtuple.