在Python中我应该在哪里定义namedtuple类-哪个命名空间?
Namedtuples在Python中用于命名小型数据集合 例如,此命名的对偶:在Python中我应该在哪里定义namedtuple类-哪个命名空间?,python,pickle,namedtuple,Python,Pickle,Namedtuple,Namedtuples在Python中用于命名小型数据集合 例如,此命名的对偶: import collections sesameEpisodeNTC = collections.namedtuple('sesameEpisodeNTC', 'lead_character', 'has_elmo') se0 = sesameEpisodeNTC(lead_character='bigbird', has_el
import collections
sesameEpisodeNTC = collections.namedtuple('sesameEpisodeNTC',
'lead_character', 'has_elmo')
se0 = sesameEpisodeNTC(lead_character='bigbird', has_elmo=False)
类定义('sesameEpisodeNTC='…)能否成为另一个类的属性?我更喜欢在类中保留一些namedtuple,以避免模块名称空间混乱。但这会导致酸洗(cPickle,dill)出现问题,而酸洗是一个阻碍展示的因素
类似地,我注意到namedtuple类定义的第一个参数,typename(即“sesameEpisodeNTC”)必须是类的名称,否则pickle就不起作用。(同时使用2.7和3.4)这种复制并不理想。typename参数还有其他最佳实践吗?除了pickle代码外,它还会影响代码吗
有没有其他没有广泛记录的角落案例,我与命名夫妇失踪?令人恼火的是,python中一些最有用的数据结构都有尖角,这些尖角会阻碍stdlib的某些部分 如果在模块级别定义
namedtuple
,dill
可以将namedtuple
类对象作为属性来pickle类。当然,这并不能帮助你“减少混乱”。我认为答案是否定的。目前,您不能在类中定义一个名为tuple的并在默认情况下对其进行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'>
>>>
导入集合
>>>nt=collections.namedtuple('nt',['one','two']))
>>>新界
>>>
>>>进口莳萝
>>>
>>>笔录副本(新界)
>>>
>>>类Foo(对象):
... cnt=nt
...
>>>f=Foo()
>>>碳纳米管
>>>f.cnt(1,2)
nt(一=1,二=2)
>>>
>>>副本(f)
>>>模拟副本(Foo)
>>>
dillgithub上有一个问题,需要做得更好,但是现在不行——你必须使用模块级的
namedtuples
——是的,它们需要与namedtuples
的第一个参数同名 记住参数值是类的真实名称;用于引用类对象的变量通常与类名相同这一事实只是一种惯例,而class
语句对这两个对象都使用相同的名称这一事实进一步说明了这一点。@chepner所说的,加上变量名和参数值,则pickle
必须相同才能工作。另外,pickle
仅适用于在模块级别定义的类,因此您会被所谓的名称空间污染所困扰,因为这意味着您不能将namedtuple
定义作为另一个类的属性。您可能可以定义自己的模块级类,该类是泛型或元命名空间定义类,可以绕过其中的一些问题。collections.namedtuple是否应该说明,要使pickle正常工作,变量名和参数名必须相同?谢谢,Mike。如果希望使用stdlib pickle,那么stdlib是否应该突出说明所有命名的耦合都应该在模块级定义?谢谢你的dill,顺便说一句-太棒了。我认为pickle
的文档可能需要对某些对象进行一些澄清,尤其是像namedtuple
这样的较新对象。