无法使用装饰器打印结果

时间:2019-06-04 15:31:37

标签: python-3.x python-2.7 python-decorators

我是学习python的新手,使用装饰器时遇到了一个陈旧的问题。我无法从@ decorate1打印结果。如果您能帮助我解决问题,将非常感谢。请在下面找到代码:

def decorate1(function):
    def wrapper(*args):
        print("the arguments are ",args)
    return wrapper


def fileoperation(function):
    def wrapper():
        f=function()
        with open("sample.txt",'w') as wf:
            wf.write(f)
    return wrapper


def listoperation(function):
    def wrapper(*args):
      mylst=[]
      for i in args:
        mylst.append(i)
      print(mylst)
    return wrapper




@listoperation
@decorate1
def display(name,age):
    pass

display('vijay',31)

@fileoperation
def filestring():
    return "This is a file"


filestring()


Output:
['vijay', 31]
[Finished in 0.2s]

1 个答案:

答案 0 :(得分:0)

您的代码存在的问题是您的装饰器未返回包装的函数。

我将举一个例子,排除filestring()函数,因为它是相同的错误。

def decorate1(function):
    def wrapper(*args, **kwargs):
        print("the arguments are ",args)
        function(*args, **kwargs)
    return wrapper

def listoperation(function):
    def wrapper(*args, **kwargs):
      mylst=[]
      for i in args:
        mylst.append(i)
      print(mylst)
      function(*args, **kwargs)
    return wrapper


@listoperation
@decorate1
def display(name,age):
    pass

display('vijay',31)

如您所见,功能有些变化:

  • 即使该示例不需要,始终构建接受和转发*args, **kwargs的包装器也比较安全,因此,以任何形式传递的任何参数都将转发到包装函数
  • 包装程序应使用其所有参数调用包装的函数:否则,将不会执行“包装”函数!

一般示例:

有时候,一个示例可以帮助将您的思想“包裹”在装饰器周围。

假设您需要一个打印前N个自然数的函数:

def my_numbers(N):
    return list(range(N))

然后您会注意到此功能以及许多其他功能有时会失败。您可能怀疑有人正在传递您不期望的参数,因此您希望在不干扰函数的情况下打印要传递的参数和函数的输出。
您编写了一个装饰器,但是由于所有函数都采用不同数量的参数和键值参数,因此请使其通用:

def my_logger(f):
    def wrapper(*args, **kwargs):
        print("Someone has passed these arguments: {0}".format(*args))
        res = f(*args, **kwargs)
        print("With the values that someone passed, I got the following output: {0}".format(res))
        return res
    return wrapper

在装饰了我们的函数之后:

@my_logger
def my_numbers(N):
    return list(range(N))

我们得到以下输出:

  

有人通过了以下论点:4
  使用某人传递的值,我得到以下输出:[0,1,2,3]
  [0,1,2,3]