语言: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)]
您也可以扩展装饰器以与其他集合一起使用(tuple
、set
等)。
关于python - 如何编写一个python函数,当输入是列表时返回列表,当输入是非列表时返回非列表值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53041890/