Прежде всего хочу подчеркнуть, что я обыскал как в Интернете, так и в документации на Python + StackOverflow, особенно очень подробно, и мне не удалось найти ответ на этот вопрос. Я также хочу поблагодарить любого, кто тратит время, чтобы прочитать это.Как добавить аргументы ключевого слова к завернутой функции в Python 2.7?
Как видно из названия, я пишу декоратора в Python, и я хочу, чтобы добавить ключевые аргументы в обернутой функции (обратите внимание: Я знаю, как добавить аргументы самого декоратора, это не то, что я спрашиваю).
Настоящий рабочий код фрагмента кода, который я написал, который делает именно это для Python 3 (в частности, Python 3.5). Он использует аргументы декоратора, добавляет аргументы ключевого слова к завершенной функции, а также определяет и добавляет новую функцию к завернутой функции.
from functools import wraps
def my_decorator(decorator_arg1=None, decorator_arg2=False):
# Inside the wrapper maker
def _decorator(func):
# Do Something 1
@wraps(func)
def func_wrapper(
*args,
new_arg1=False,
new_arg2=None,
**kwds):
# Inside the wrapping function
# Calling the wrapped function
if new_arg1:
return func(*args, **kwds)
else:
# do something with new_arg2
return func(*args, **kwds)
def added_function():
print("Do Something 2")
func_wrapper.added_function = added_function
return func_wrapper
return _decorator
Теперь этот декоратор можно использовать следующим образом:
@my_decorator(decorator_arg1=4, decorator_arg2=True)
def foo(a, b):
print("a={}, b={}".format(a,b))
def bar():
foo(a=1, b=2, new_arg1=True, new_arg2=7)
foo.added_function()
Теперь, в то время как это работает на Python 3.5 (и я предполагаю, что для любого 3.x), мне не удалось сделать он работает для Python 2.7. Я получаю SyntaxError: invalid syntax
в первой строке, которая пытается определить новый аргумент ключевого слова для func_wrapper
, что означает строку, указывающую new_arg1=False,
, при импорте модуля, содержащего этот код.
Перемещение новых ключевых слов в начало списка аргументов func_wrapper
решает SyntaxError
, но, похоже, винт с подпиткой завернутой функции; Я получаю сообщение об ошибке TypeError: foo() takes exactly 2 arguments (0 given)
при звонке foo(1, 2)
. Эта ошибка исчезает, если я однозначно назначаю аргументы, как в foo(a=1, b=2)
, но этого явно недостаточно - неудивительно, что мои новые аргументы ключевых слов, похоже, «крадут» первые два позиционных аргумента, отправленные в завернутую функцию. Этого не произошло с Python 3.
Я бы с удовольствием помог вам в этом. Спасибо, что нашли время, чтобы прочитать это.
Шей
код не работает, как есть: вы должны импортировать functools, и есть заявление (возможно, печать ("added_function")) в added_function. –
@RoryYorke Отредактировано! Спасибо, человек! :) – ShayPal5
Как смешно я задавал именно этот вопрос в одно и то же время (ну через 20 минут после вас). Хорошо, что я снова просмотрел «Вопросы, которые могут уже иметь ваш ответ» после того, как я закончил просить, и до того, как я нажал кнопку «отправить свой вопрос». – Davide