我正在使用一个开源库,他们定义了一个类,如下所示:
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
Run Code Online (Sandbox Code Playgroud)
我需要获取属性(DUMMY,EC2等)并将它们转换为元组的排序列表,看起来像这样:
[(0, 'DUMMY'), (1, 'EC2'), ...]
Run Code Online (Sandbox Code Playgroud)
我想对属性本身的名称进行排序.我想出了一些解决这个问题的方法,包括以下似乎是处理这个问题的低效方法:
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))
Run Code Online (Sandbox Code Playgroud)
它有效,但似乎不优雅,并且可能有更好的方式.我也看到了通过这样做构建列表的方式中的缺陷if not k.startswith('__')- 主要是如果开源库将方法添加到Provider类的话?
只是寻找一些可能更有效的意见和其他技术.
如果您正在寻找类型为整数的类变量,您可以这样做:
import inspect
PROVIDER_CHOICES = inspect.getmembers(Foo, lambda x: isinstance(x, int))
Run Code Online (Sandbox Code Playgroud)
查看检查模块以获取更多信息.
另外:您可以PROVIDER_CHOICES.sort(key=...)在最后一行使用,它可以进行就地排序.
编辑:getmembers返回文档中所述的排序列表,因此sorted是不必要的(感谢JF Sebastian)
| 归档时间: |
|
| 查看次数: |
100 次 |
| 最近记录: |