Декораторы: Почему я получаю разные результаты?Если я передаю функцию с параметрами, обязательна ли запись @? - PullRequest
0 голосов
/ 03 декабря 2018
def smart_divide(func):
   def inner(a,b):
      print("I am going to divide",a,"and",b)
      if b == 0:
         print("Whoops! cannot divide")
         return
      return func(a,b)
   return inner

@smart_divide
def divide(a,b):
    return a/b
print(divide(10,2))   # prints 5, correct

фрагмент кода 2:

def smart_divide(func):
   def inner(a,b):
      print("I am going to divide",a,"and",b)
      if b == 0:
         print("Whoops! cannot divide")
         return
      return func(a,b)
   return inner

def divide(a,b):
    return a/b

print(smart_divide(divide(10,2))) # why is this printing function address ?

1 Ответ

0 голосов
/ 03 декабря 2018

Второй фрагмент неверен.

@smart_divide
def divide(a,b):
    ...

divide(10,2)

Эквивалентно

smart_divide(divide)(10, 2)
# Not to smart_divide(divide(10,2))

Видите разницу?smart_divide ожидает функцию.Вы предоставили это поплавок.Если вы попытаетесь вызвать его снова, вы получите ожидаемую ошибку 'float' object is not callable:

 smart_divide(divide(10, 2))(10, 2)
 TypeError: 'float' object is not callable
...