Skip to main content
 首页 » 编程设计

python之将对象的属性转换为已排序的元组列表的首选技术是什么

2025年05月04日17thcjp

我正在使用一个开源库,他们定义了一个这样的类:

class Provider(object): 
    """ Defines for each of the supported providers """ 
    DUMMY = 0 
    EC2 = 1 
    EC2_EU = 2 
    RACKSPACE = 3 
    SLICEHOST = 4 
    GOGRID = 5 
    VPSNET = 6 
    LINODE = 7 
    VCLOUD = 8 
    RIMUHOSTING = 9 

我需要获取属性(DUMMY、EC2 等)并将它们转换为经过排序的元组列表,如下所示:

[(0, 'DUMMY'), (1, 'EC2'), ...] 

我想根据属性本身的名称进行排序。我想出了一些方法来解决这个问题,包括以下似乎是一种低效的处理方法:

import operator 
from libcloud.types import Provider 
 
PROVIDER_CHOICES = [(v,k) for k, v in vars(Provider).items() 
                                   if not k.startswith('__')] 
PROVIDER_CHOICES = sorted(PROVIDER_CHOICES, key=operator.itemgetter(1)) 

它有效,但看起来不够优雅,而且可能有更好的方法。我还看到我通过执行 if not k.startswith('__') 构建列表的方式存在缺陷 - 主要是如果开源库向 Provider 类添加方法怎么办?

只是寻找一些意见和其他可能对此更有效的技术。

请您参考如下方法:

如果你正在寻找整数类型的类变量,你可以这样做:

import inspect 
PROVIDER_CHOICES = inspect.getmembers(Foo, lambda x: isinstance(x, int)) 

查看 inspect模块以获取更多信息。


顺便说一句:您可以在最后一行使用 PROVIDER_CHOICES.sort(key=...),它会进行就地排序。

编辑:getmembers 返回文档中所述的排序列表,因此不需要 sorted(感谢 J.F. Sebastian)