干跑装饰

时间:2015-08-10 19:02:17

标签: python metaprogramming python-decorators

我试图编写一个包装函数的函数装饰器。如果使用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"

1 个答案:

答案 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