Вы можете создать декоратор [PEP-318] , который будет выглядеть так:
from functools import wraps
def map_list(f):
@wraps(f)
def decorator(item_list, *args, **kwargs):
if isinstance(item_list, list):
return [f(item, *args, **kwargs) for item in item_list]
else:
return f(item_list, *args, **kwargs)
return decorator
тогда вы можете применить декоратор к «простой» функции:
<b>@map_list</b>
def my_datetime_parse_function(dt, format=None):
return datetime.strptime(dt, format)
это всегда проверяет параметр first , и, если это список, выполните отображение, остальные параметры просто передаются в качестве дополнительных параметров "простой" функции. Таким образом, декоратор может быть применен ко всем функциям, которые вы хотите «декорировать» с помощью этого поведения.
Таким образом, простая функция может сфокусироваться на том, как «сопоставить» отдельный элемент, а декоратор позаботится о случае списка.
Например:
>>> my_datetime_parse_function('1/1/2018', format='%d/%m/%Y')
datetime.datetime(2018, 1, 1, 0, 0)
>>> my_datetime_parse_function(['1/1/2018', '10/1/2018', '11/7/1302'], format='%d/%m/%Y')
[datetime.datetime(2018, 1, 1, 0, 0), datetime.datetime(2018, 1, 10, 0, 0), datetime.datetime(1302, 7, 11, 0, 0)]
Вы можете расширить возможности декоратора для работы с другими коллекциями (tuple
s, set
s и т. Д.).