Предположим, такой пример быстрого декоратора:
def read_a_book():
return "I am reading the book: "
def add_a_book(func):
def wrapper():
return func() + "Python Cookbook"
return wrapper
Запустите его и перейдите к
In [7]: read_a_book = add_a_book(read_a_book)
In [8]: read_a_book()
Out[8]: 'I am reading the book: Python'
Я собираюсь сделать add_a_book
общим и изменить его следующим образом:
def add_a_book(func, book):
def wrapper():
return func() + book
return wrapper
Запустите его и получите:
In [7]: read_a_book = add_a_book(read_a_book,"Python")
In [8]: read_a_book()
Out[8]: 'I am reading the book: Python'
Работает как задумано,
Однако выдает ошибки, когда я пробовал символ @
In [10]: @add_a_book("Python")
...: def read_a_book():
...: return "I am reading the book: "
TypeError: add_a_book() missing 1 required positional argument: 'book'
#additionaly
In [11]: @add_a_book
...: def read_a_book():
...: return "I am reading the book: "
TypeError: add_a_book() missing 1 required positional argument: 'book'
In [12]: @add_a_book()
...: def read_a_book("python"):
...: return "I am reading the book: "
^
SyntaxError: invalid syntax
Как решить такиепроблема при добавлении параметров в декоратор?