Почему эта функция декорирования не будет вызвана без использования дополнительных скобок? - PullRequest
0 голосов
/ 02 апреля 2020

Я изучаю Python на Sololearn, и я наткнулся на этот бит кода, который намеревается украсить функцию:

def decor(func):
  def wrap():
    print("============")
    func()
    print("============")
  return wrap

def print_text():
  print("Hello world!")

Когда я вызываю это так decor(print_text) Я просто получаю этот вывод <function __main__.decor.<locals>.wrap()>

Чтобы получить ожидаемый, оформленный вывод, мне нужно вызвать функцию с дополнительным набором пустых скобок, например, decor(print_text)()

, которая выводит правильный результат:

============
Hello world!
============

Я понимаю, что существует более простой способ декорирования без этого беспорядка, однако я нахожусь в нем надолго и хотел бы ознакомиться с тем, как python "думает". Итак, мой вопрос: почему дополнительный набор скобок () необходим для получения правильного вывода? Почему бы просто не использовать decor(print_text), чтобы получить правильный результат?

Спасибо всем! Я прошу прощения за длинные вопросы, но я пытаюсь объяснить свою мысль как можно лучше:)

Хорошо, я думаю, что вы, все я думаю, ответили на все мои вопросы относительно этого кода замечательные люди ниже. Спасибо всем за помощь!

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Ваш декоратор возвращает функцию. Для вызова этой функции вам нужны скобки.

def decor(func):
  ...
  return wrap
  ...

Если бы это было:

def decor(func):
  ...
  return wrap()
  ...

Тогда decor вернул бы результат вызова wrap, функции, которую вы определили.

1 голос
/ 02 апреля 2020

decor(print_text) дает правильный результат ... который является функцией . Чтобы вызвать эту функцию, вам нужны скобки. Представьте, что ваша функция принимает параметр:

def print_text(x):
  print("Hello " + x + "!")

- как вы думаете, как будет вызываться декорированная функция? Да, с decor(print_text)("world"). Это проясняет ситуацию?

...