2012-04-11 8 views
3

エラー/ステータスコード検索のための静的変数を持つクラスがあります。 例として値によるPythonクラス変数ルックアップ

class Foo(object): 
    OK = 200 
    Not_Modified = 304 
    Forbidden = 403 
    Internal_Server_Error = 500 

をHTTPステータスコードを取る今私は口頭で、ステータスコードに( 'OK'、 'Not_Modified'、など)ベース(200、403、など)を取得する必要があります。他のプログラムがそれを使用しているので、クラスの構造を変更することはできません。だから私は{code : description}が含まれている辞書description_by_valを作成しました:

from collections import Hashable 

class Foo(object): 
    OK = 200 
    Not_Modified = 304 
    Forbidden = 403 
    Internal_Server_Error = 500 
    description_by_val = dict((value, key) 
     for key, value in locals().iteritems() 
      if not key.startswith("__") and value and isinstance(value, Hashable)) 


>>> Foo.description_by_val[200] 
'OK' 

今私は、パフォーマンスとコードの練習の面で疑問を持っています。

  • Foo.description_by_valと呼び出すたびに、辞書が再生成されますか?データセットが非常に小さい場合でも、これはうまくいかない。なぜなら、これは何百万回も呼び出すからである。
  • それは単に悪い練習にアプローチするのですか?手動で辞書を手動で作成する必要はなく、静的変数にする必要があります。

更新:

私の同僚はちょうど私がそれが再生成されますかどうかを確認するためにdescription_by_valの作成中に何かを印刷することができることを私に指摘しました。

>>> from collections import Hashable 
>>> 
>>> def show(key): 
...  print key 
...  return True 
... 
>>> 
>>> class Foo(object): 
...  OK = 200 
...  Not_Modified = 304 
...  Forbidden = 403 
...  Internal_Server_Error = 500 
...  description_by_val = dict((value, key) 
...   for key, value in locals().iteritems() 
...    if not key.startswith("__") and key and isinstance(value, Hashable) and show(key)) 
... 
OK 
Forbidden 
Internal_Server_Error 
Not_Modified 
>>> 
>>> Foo.description_by_val 
{200: 'OK', 304: 'Not_Modified', 403: 'Forbidden', 500: 'Internal_Server_Error'} 
>>> Foo.description_by_val 
{200: 'OK', 304: 'Not_Modified', 403: 'Forbidden', 500: 'Internal_Server_Error'} 
>>> Foo.description_by_val[200] 
'OK' 

私は現在、パフォーマンスについて心配する必要はありません。私はそれがなぜこのように振る舞うかを知りたいです。

+0

いいですね。 –

+0

すべてのステータスの後に、そして何かの前に 'dict'を作成してください。 – agf

+0

この質問に対する回答の一部は興味深いかもしれません:http://stackoverflow.com/questions/36932/whats-the-best-way-to-implement-an-enum-in-python – SingleNegationElimination

答えて

4

あなたの考えは健全です。ディクショナリは、初めて作成されたときにのみ、再生成されません。ルックアップは効率的で信頼性が高く、問題が発生する可能性は低いです。このようなリバース辞書を使用するのはかなり一般的です。あなたは良い場所にもisinstance(value, Hashable)のチェックを入れています。あなたは大丈夫です。編集 - -

あなたのコードは結構です、私は、末尾の括弧を逃しました。