我应该在哪里定义 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
的第一个参数同名。
命名元组在 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
的第一个参数同名。