【问题标题】:Unable to print result using decorators无法使用装饰器打印结果
【发布时间】:2019-10-20 04:04:11
【问题描述】:

我是学习 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之前缺少@

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


【解决方案1】:

你的代码的问题是你的装饰器没有返回被包装的函数。

我会举个例子,不包括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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 2021-01-06
    • 2019-01-20
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    相关资源
    最近更新 更多