Как написать функцию python, которая возвращает список, когда входные данные являются списком, и возвращает не-список значений, когда входные данные не являются списком? - PullRequest
0 голосов
/ 29 октября 2018

Язык: Python 3.x

Я хочу написать функцию, которая возвращает тип списка, только если тип ввода является списком, но более красивым способом, надеемся, используя декоратор.

Я мог бы сделать это так, как показано ниже, но как бы вы поступили иначе, если бы вам пришлось писать этот шаблон много раз?

from datetime import datetime

def my_datetime_parse_function(datetime_list, format=None):

    if isinstance(datetime_list, list):
        return [ datetime.strptime(dt, format) for dt in datetime_list ]

    elif isinstance(datetime_list, str):
        return datetime.strptime(datetime_list, format)

    else:
        raise ValueError

1 Ответ

0 голосов
/ 29 октября 2018

Вы можете создать декоратор [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 и т. Д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...