python类变量按值查找

我有一个带有静态变量的类,用于错误/状态代码查找.
以HTTP状态码为例

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

现在,我需要根据代码(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'

我现在很高兴自己不必担心性能.我想找出为什么会这样:)

解决方法:

你的想法是正确的.字典不会每次都重新生成,而只会在第一次创建时重新生成.查找是有效且可靠的,这不太可能引起我看到的问题.使用这种反向字典非常普遍,并且在合适的地方也可以进行isinstance(value,Hashable)检查.你应该没事的.

-编辑-

您的代码很好,我只是错过了尾随的括号.

上一篇:清理PHP中合法变量名称的字符串


下一篇:php-使函数在当前范围内设置变量