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

Where should I define namedtuple classes in Python - which namespace?

命名元组在 Python 中很有用,可以命名小型数据集合。

以这个命名元组为例:

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

能否将 class 定义 ('sesameEpisodeNTC = '...) 设为另一个 class 的属性?我更愿意在 classes 中保留一些命名元组以避免混淆模块命名空间。但这会导致酸洗(cPickle、dill)出现问题,这是一个阻碍。

同样,我注意到namedtuple class定义的第一个参数,typename(即'sesameEpisodeNTC')必须是class的名称,否则pickling不会工作。 (同时使用 2.7 和 3.4)这种复制并不理想。 typename 参数是否有其他最佳实践,它会影响 pickling 代码之外的代码吗?

命名元组是否遗漏了其他未广泛记录的极端情况?令人恼火的是,python 的一些最有用的数据结构具有尖角,可能会卡住部分标准库。

如果您在模块级别进行 namedtuple 定义,dill 可以使用 namedtuple class 对象作为属性来 pickle class。当然,这对你没有帮助"reduce clutter"。我认为答案是否定的。目前,您不能在 class 中定义 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 上有一个 ticket/issue 可以做得更好,但现在没有——你必须忍受模块级别 namedtuples —— 是的,它们需要与 namedtuple 的第一个参数同名。