У меня есть класс, который предоставляет простой интерфейс для API. Я хочу определить метод этого класса для каждого маршрута.
Поскольку большинство маршрутов одинаковы, многие функции могут быть преобразованы в более общую функцию, причем многие маршруты являются лишь частично примененной версией этой функции
class MyAPIWrapper:
def _get_results(self, route, **params):
# Do the important stuff here
results = ...
return results
def get_customers(self):
return self._get_results(self, 'customers')
def get_transactions(self):
return self._get_results(self, 'transactions')
# etc, etc, etc
Однако очевидно, что это все еще приводит к значительному количеству шаблонов в определении класса.
Одной из альтернатив является добавление нового метода, который добавляет метод каждого маршрута программно:
import functools
class MyAPIWrapper:
def __init__(self):
self._init_route_methods()
def _get_results(self, route, **params):
# Do the important stuff here
results = ...
return results
def _init_route_methods(self):
for route in ['customers', 'transactions', ...]:
route_fn = functools.partial(self. _get_results, route)
setattr(self, f'get_{route}', route_fn)
Преимущество заключается в уменьшении количества шаблонов и позволяет легко добавлять / удалять маршруты. Однако добавление методов при инициализации кажется мне несколько не элегантным.
Есть ли лучший и / или более идиоматический способ сделать это?