Невозможно распечатать результат с помощью декораторов - PullRequest
0 голосов
/ 04 июня 2019

Я новичок в изучении Python и столкнулся с серьезной проблемой при использовании декоратора.Я не могу напечатать результат из @ decorate1.We очень признателен, если вы можете помочь мне с этой проблемой.Пожалуйста, найдите код ниже:

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 голосов
/ 04 июня 2019

Проблема с вашим кодом в том, что ваш декоратор не возвращает упакованную функцию.

Я приведу пример, исключая функцию 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]

...