エラー/ステータスコード検索のための静的変数を持つクラスがあります。 例として値による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'
私は現在、パフォーマンスについて心配する必要はありません。私はそれがなぜこのように振る舞うかを知りたいです。
いいですね。 –
すべてのステータスの後に、そして何かの前に 'dict'を作成してください。 – agf
この質問に対する回答の一部は興味深いかもしれません:http://stackoverflow.com/questions/36932/whats-the-best-way-to-implement-an-enum-in-python – SingleNegationElimination