gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:14:02 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com