提问人:Wör Du Schnaffzig 提问时间:10/25/2021 更新时间:10/25/2021 访问量:139
带有可变函数的函数参数,避免“if arg is None”构造
Function argument with mutables, avoid `if arg is None` construct
问:
有没有办法避免像下面这样的重复代码?对 20 个其他函数进行成像,这些函数采用具有默认值的可变参数。
每次检查参数时,每次在分支中分配默认值。
将默认值放在函数签名中不起作用,因为 python 会在首次调用函数时缓存该值。None
if
import datetime as dt
def dt_to_str(dtime: dt.datetime = None):
if dtime is None:
dtime = dt.datetime.now()
return dtime.strftime("%c")
if __name__ == '__main__':
print(dt_to_str())
答:
1赞
kaya3
10/25/2021
#1
我认为在大多数情况下,语法是最好的解决方案。但是,如果您真的对此感到困扰,这里有一个适用于单参数函数的装饰器:if arg is None: arg = ...
from functools import wraps
def default_argument(arg_factory):
def decorator(f):
@wraps(f)
def wrapped(arg=None):
if arg is None:
arg = arg_factory()
return f(arg)
return wrapped
return decorator
用法示例如下:可以传递对现有函数的引用,也可以传递 .lambda
import datetime as dt
@default_argument(dt.datetime.now)
def dt_to_str(dtime):
return dtime.strftime('%c')
print(dt_to_str())
# Mon Oct 25 00:16:03 2021
@default_argument(lambda: [])
def thing_with_list(lst):
return lst + [123]
print(thing_with_list())
# [123]
评论
if
None