Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中我应该在哪里定义namedtuple类-哪个命名空间?_Python_Pickle_Namedtuple - Fatal编程技术网

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

在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

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

例如,此命名的对偶:

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
这样的较新对象。