我正在使用一个开源库,他们定义了一个这样的类:
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)
关于python - 将对象的属性转换为已排序的元组列表的首选技术是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1815693/