2016-05-07 16 views
4

NamedtuplesはPythonで小さなデータコレクションの名前を付けるのに便利です。どこで名前付きタプルクラスをPythonで定義すべきですか - どの名前空間ですか?

例えば、このnamedtupleを取る:

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

は、クラス定義( 'sesameEpisodeNTCは=' ...)別のクラスの属性を行うことができますか?モジュールネームスペースが乱雑にならないように、クラス内にいくつかの名前付きタプルを保持することをお勧めします。しかし、これは漬け物(cPickle、dill)に問題を引き起こす。

同様に、名前付きタプルクラス定義の最初のパラメータに注目しました。タイプ名(つまり 'sesameEpisodeNTC')はクラスの名前でなければなりません。そうでなければ酸洗は機能しません。 (2.7と3.4の両方を使用して)重複は理想的ではありません。 typenameパラメータのベストプラクティスは他にもありますが、コードを酸漬けのコードに影響しますか?

名前のついたタップルで見つからない他の広範に文書化されていないコーナーケースがありますか? Pythonの最も有用なデータ構造の一部は、stdlibの一部に絡みつく可能性のある鋭いコーナーを持っています。

+0

パラメータ値*は、クラスの実際の名前です。クラスオブジェクトを参照するために使用する変数が通常はクラス名と同じであるという事実は単なる規約であり、 'class'文が両方に対して同じ名前を使用するという事実によって補強されています。 – chepner

+0

@chepnerが言ったことに加えて、 'pickle'が動作するためには変数名とパラメータ値が同じでなければなりません。また、 'pickle'はモジュールレベルで定義されたクラスに対してのみ機能しますので、' namedtuple'定義を別のクラスの属性にすることはできないので、いわゆる名前空間汚染に悩まされています。これを回避するために汎用的またはメタ名前空間定義クラスである独自のモジュールレベルのクラスを定義することができるかもしれません。 – martineau

+0

collections.namedtupleは、pickleを動作させるために、変数名とパラメータ名が同じでなければならないことを文書化する必要がありますか? – MHH

答えて

0

モジュールレベルでnamedtupleの定義を作成する場合、dillはクラスオブジェクトnamedtupleを属性としてピクルすることができます。もちろん、これは "混乱を軽減"するのに役立ちません。私は答えがノーだと思う。現時点では、クラス内に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の上のチケット/問題はもっとうまくできるようにするではありませんが、今は何も - あなたはモジュールレベルnamedtuplesと一緒に暮らす必要があるだろう - はい、彼らが持っている必要がありますnamedtupleの最初のパラメータと同じ名前です。

+0

ありがとう、マイク。 stdlibは、stdlib pickleを使用することを望む場合、すべての名前付き組をモジュールレベルで定義する必要があることを明示的に文書化すべきですか?ディル、ありがとう、btw - それは素晴らしいです。 – MHH

+0

私は 'pickle'のドキュメントは特定のオブジェクト、特に' namedtuple'のような新しいオブジェクトについては何らかの明確化が必要かもしれないと思います。 –

関連する問題