2014-01-19 18 views
1

名字如果我有这样一个类:的Python:转换的常量值的常量

class MyClass: 
    ONE = 1 
    TWO = 2 

有没有一种方法来简化以下使用反射或其他一些Python功能的代码?

def class_value_to_string(my_class_num): 
    if my_class_num == MyClass.ONE: 
     return "ONE" 
    elif my_class_num == MyClass.TWO: 
     return "TWO" 
    else: 
     return "UNKNOWN VALUE" 
+0

谢谢,这是我一直在寻找。 –

回答

3

您可以枚举类的属性和反向查找:

enum_names = {value: name for name, value in vars(MyClass).items() if name.isupper()} 

使用这个你可以映射值回名。

演示:

>>> class MyClass: 
...  ONE = 1 
...  TWO = 2 
... 
>>> enum_names = {value: name for name, value in vars(MyClass).items() if name.isupper()} 
>>> enum_names[1] 
'ONE' 
1
class MyClass: 
    ONE = 1 
    TWO = 2 
    def func(self): 
     return 105 

def foo(): 
    return 204 

MyClass.akfoo = foo 

def class_value_to_string(my_class_num,the_class): 
    try: 
     return (k for k,v in the_class.__dict__.iteritems() if v==my_class_num).next() 
    except: 
     return "UNKNOWN VALUE" 

print class_value_to_string(1,MyClass) 
print class_value_to_string(2,MyClass) 
print class_value_to_string(3,MyClass) 
print class_value_to_string(MyClass.func.im_func,MyClass) 
print class_value_to_string(foo,MyClass) 

结果

ONE 
TWO 
UNKNOWN VALUE 
func 
akfoo