У меня есть набор функций/методов, у которых есть разные набор позиционных аргументов и, в некоторых случаях, аргументы с ключевыми словами, но разделяйте один строковый аргумент с именем lane_type. Это может быть либо позиционный, либо ключевой аргумент. Из-за дефекта дизайна (виноватого в качестве обвинения) одно и то же значение в разных местах может иметь заглавные буквы в строке. Поэтому для сравнения я должен преобразовать его в нижний регистр. В конце концов я решил попробовать и сделать преобразование через декоратор:Декоратор для функций с позиционными аргументами, с обычно называемым аргументом
def lt_dec(func):
def _lt_lower(**kwargs):
kwargs['lane_type'] = kwargs['lane_type'].lower()
return func(**kwargs)
return _lt_lower
Конечно, я пытался проверить его - и это не удалось:
In [38]: @lt_dec
def test1(lane_type):
print lane_type
....:
In [39]: test1('Solid')
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/homes/markg/<ipython-input-39-bb6cef5c7fad> in <module>()
----> 1 test1('Solid')
TypeError: _lt_lower() takes exactly 0 arguments (1 given)
Очевидно, что я не совсем понимаю, ** kwargs. Я буду очень благодарен за объяснение, чего у меня нет, и если есть изящное решение для моей проблемы.
EDIT:
Я считаю, что я должен показать некоторые примеры определений функций для ясности: Вот один метод из класса
def add_polygon(self, points, lane_type, color):
метод из другого класса:
def __init__(self, points, lane_type, color, side=None):
A функция
def lane_weight(lane_type):
Конечно, для функции с 1 аргумента (у меня есть несколько из них) решение простое
def lt_dec(func):
def _lt_lower(lane_type):
return func(lane_type)
return _lt_lower
Как есть уже говорилось выше, - это есть общее решение, которое для всех примеров показали? (Я готов принять Нет, как ответ)
«решение прост» - да? этот код ничего не делает ... –