我试图编写一个包装函数的函数装饰器。如果使用dry=True
调用该函数,则该函数应该只打印其名称和参数。如果用dry=False
调用,或者没有干作为参数,它应该正常运行。
我有一个玩具:
from functools import wraps
def drywrap(func):
@wraps(func)
def dryfunc(*args, **kwargs):
dry = kwargs.get('dry')
if dry is not None and dry:
print("Dry run {} with args {} {}".format(func.func_name, args, kwargs))
else:
if dry is not None:
del kwargs['dry']
return func(*args, **kwargs)
return dryfunc
@drywrap
def a(something):
# import pdb; pdb.set_trace()
print("a")
print(something)
a('print no dry')
a('print me', dry=False)
a('print me too', dry=True)
...但是当我把它放到我的应用程序中时,即使参数中有dry=True
,也不会运行print语句。我也试过了:
from functools import wraps
def drywrap(func):
@wraps(func)
def dryfunc(*args, **kwargs):
def printfunc(*args, **kwargs):
print("Dry run {} with args {} {}".format(func.func_name,args,kwargs))
dry = kwargs.get('dry')
if dry is not None and dry:
return printfunc(*args, **kwargs)
else:
if dry is not None:
del kwargs['dry']
return func(*args, **kwargs)
return dryfunc
我应该注意,作为我的应用程序的一部分,drywrap函数是utils文件的一部分,在使用之前导入...
src/build/utils.py <--- has drywrap
src/build/build.py
src/build/plugins/subclass_build.py <--- use drywrap via "from build.utils import drywrap"
答案 0 :(得分:0)
这感觉就像一个解决方案。
def drier(dry=False):
def wrapper(func):
def inner_wrapper(*arg,**kwargs):
if dry:
print(func.__name__)
print(arg)
print(kwargs)
else:
return func(*arg,**kwargs)
return inner_wrapper
return wrapper
@drier(True)
def test(name):
print("hello "+name)
test("girish")
@drier()
def test2(name,last):
print("hello {} {}".format(name,last))
但正如你所看到的,即使你没有任何论据,你也必须提供@drier()
而不是@drier
。
注意:使用python 3.4.1