Я работаю с библиотекой с открытым исходным кодом, и они определяют класс следующим образом:Каков предпочтительный метод преобразования свойств объекта в отсортированный список кортежей?
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
мне нужно принять свойства (фиктивной, 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('__')
- в основном, что если lib с открытым исходным кодом добавляет методы в класс Provider?
Просто найдите некоторые мнения и другие методы, которые могут работать лучше для этого.
Зачем вам это нужно в первую очередь? – Randell
Используйте 'if not k.startswith ('_')'. Это соглашение, что элементы, начинающиеся с '_', не являются общедоступными. – jfs
Что вы на самом деле пытаетесь достичь здесь? Если вы хотите иметь контейнер для констант, вы можете также использовать словарь. Или просто используйте строки (например, «GOGRID»), так как это питонический способ справиться с такими вещами. (Строки интернированы, а многие из той же строки не попадают в память, поэтому они как-то похожи на символы lisp.) – bayer