python - 如何编写一个python函数,当输入是列表时返回列表,当输入是非列表时返回非列表值?

标签 python list

语言: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

最佳答案

你可以做一个 decorator [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)

这将始终检查第一个参数,如果它是一个列表,则执行映射,其他参数只是作为额外参数传递给“简单”函数。因此,装饰器可以应用于您想要用此行为“装饰”的所有函数。

因此,简单函数可以专注于如何“映射”单个项目,而装饰器将处理列表情况。

例如:

>>> 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)]

您也可以扩展装饰器以与其他集合一起使用(tupleset 等)。

关于python - 如何编写一个python函数,当输入是列表时返回列表,当输入是非列表时返回非列表值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53041890/

相关文章:

java - 赋值的左侧必须是变量

python - 如何通过 TCP 套接字发送列表 - Python

python - 如何以python方式以任意顺序迭代两个列表

Python:3D 列表、总和列

list - 在 mathematica 中使用 map/select 在列表中查找子列表

python - 使用 tf.while_loop 对张量进行切片

python - 如何使用 matplotlib 或任何其他库创建词频图

python - 删除元组列表中除整数之间间隙最小的所有元组

python - 整个子图的颜色图

python - 如何从列表列表中的每个列表中删除某些索引