#python #function
#python #функция
Вопрос:
Итак, у меня есть работающий алгоритм сортировки на Python. (Его точное содержимое не имеет отношения к этому вопросу.) Он использует список с именем «люди», содержащий экземпляры класса, и функция жестко запрограммирована для сортировки этого списка по определенному атрибуту «богатство».
def my_sort(seq):
# sorts by seq[n].wealth
...
my_sort(people)
Теперь я хотел бы обобщить функцию, чтобы я мог сортировать по любому атрибуту.
def my_sort2(seq, key):
# sorts by seq[n].key
...
my_sort2(people, wealth)
Но это, конечно, выдает ошибку, потому что он не знает, что нужно рассматривать «богатство» как атрибут класса. Итак, как это возможно сделать?
Комментарии:
1. Из любопытства, что не так с алгоритмом сортировки по умолчанию в Python?
2. У меня есть привычка делать что-то сложным путем, когда я замечаю, что моих навыков в какой-то области недостаточно.
Ответ №1:
Вы могли бы передать имя атрибута:
def my_sort2(seq, keyname):
sort by getattr(seq[n], keyname)
my_sort2(people, 'wealth')
или функтор getter:
def my_sort2(seq, keyfunc):
sort by keyfunc(seq[n])
my_sort2(people, operator.attrgetter('wealth'))
Я предпочитаю последний подход, поскольку он более общий. Например, он легко позволяет вычислять ключи.
Ответ №2:
Общая функция получения атрибутов getattr
должна работать:
gettattr(obj, name)