Python:将常量的值转换为常量的名称

Python:将常量的值转换为常量的名称,python,reflection,Python,Reflection,如果我有这样一门课: 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:

如果我有这样一门课:

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"

您可以枚举类的属性并反转查找:

enum_names = {value: name for name, value in vars(MyClass).items() if name.isupper()}
使用此选项,可以将值映射回名称

演示:

结果

ONE
TWO
UNKNOWN VALUE
func
akfoo

我不知道为什么投票结束了。但它突出了一个常见的SO问题,在其他地方可能有有用的答案,但来自谷歌的人肯定永远不会在他们的搜索中找到这些答案,这通常是由软件开发人员的技术术语引起的。当然,没有人会在谷歌上搜索
Enum类(使用tostring fromstring)
,如果他们甚至不知道这些术语是什么,而想完全按照这个标题所说的去做的话。我投票重新打开。@not2qubit AFAIK,这个封闭的问题在搜索中仍然可见(尝试用谷歌搜索标题)。它充当了一个路标,将你们和其他答案的问答对联系起来,因为,正如你们所说的,若人们使用不同的搜索字符串,他们将无法找到那个一对。作为副本结束的目的是希望只保留1个问答对,然后将其他问答对链接到该问答对。来自搜索的用户将链接到另一个。这在py3上不起作用,即使是
import six
from future.utils import iteritems
。如果尝试使用items()作为替换,则使用AttributeError会得到
:'int'对象没有属性'\uuu dict\uu
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