LINUX.ORG.RU

Различный набор аргументов у функции и обёртки

 , декораторы


0

1

Имеется ли что-то против того, чтобы у обёртываемой декоратором функции и обёртки, возвращаемой декоратором, были разные наборы аргументов?

Типа такого:

#!/usr/bin/python
# -*- coding: utf-8 -*-

def decorator(func):
    def wrapper(x):
        func(x, 1)
    return wrapper

@decorator
def wrapped(x, y):
    print x, y

wrapped(3)    # печатает 3 1

wrapped(1, 2) # здесь ошибка: TypeError: wrapper() takes exactly 1 argument (2 given)

Ты не понимаешь почему вылез TypeError?

anonymous
()

декорируемая функция скармливается декоратору как параметр. зачем ещё что-то скармливать?

AGUtilities ★★★
()

В таком примере тебе значение по-умолчанию нужно. Вообще, думаю так делать не стоит.

Kalashnikov ★★★
()

зависит от желаемого эффекта. Если тербуется сохранение интерфейса декорируемых ф-ий, то так делать не стоит по очевидной причине. Если, например, нужно как-то нетривиально задать часть аргументов, то вполне можно.

mashina ★★★★★
()
Ответ на: комментарий от mashina

Если, например, нужно как-то нетривиально задать часть аргументов, то вполне можно.

У меня декоратор как раз подготавливает аргументы для оборачиваемой функции.

retarded
() автор топика
Ответ на: комментарий от AGUtilities

и ошибка тут не в декораторе, а в голове

fixed :) Юзернейм ТС правильно выбрал.

buddhist ★★★★★
()
Последнее исправление: buddhist (всего исправлений: 1)

Имеется ли что-то против того, чтобы у обёртываемой декоратором функции и обёртки, возвращаемой декоратором, были разные наборы аргументов?

Ничего не имеется, зависит от того что хочется получить в итоге. Можно сделать вообще декоратор принимающий ф-ю с произвольной сигнатурой:

def decorator(func):
    def wreapper(*rags, **kw_args):
        ...
        return func(*rags,**kw_args)
    return wrapper
AIv ★★★★★
()
Ответ на: комментарий от retarded

Там довольно много букв, а у меня немного болит голова.

Из скромного личного опыта - если Вы не в состоянии сформулировать связным русским языком для окружающих что Вы планируете сделать, значит Вы не можете это нормально сделать.

AIv ★★★★★
()
Ответ на: комментарий от retarded

По ссылке нет декораторов.

Конкретно в данном случае можно сделать кейворд аргумент у декоратора или функции которую он декорирует.

def decorator(func):
    def wrapper(x, y=1):
        func(x, y)
    return wrapper

@decorator
def wrapped(x, y):
    print x, y

zz ★★★★
()
Ответ на: комментарий от zz

Да не вопрос. Меня интересует, упоминается ли где-нибудь в PEP'ах (или где бы то ни было) такое использование декораторов как not recommended или bad practice.

retarded
() автор топика
Ответ на: комментарий от retarded

Ок. И в чем существующее поведение(захват всех keyword аргументов) отличается от желаемого(какого?)?

zz ★★★★
()
Ответ на: комментарий от zz

Да ничем. То, что по ссылке, работающее решение. Меня волнуют возможные идеологические разногласия.

retarded
() автор топика
Ответ на: комментарий от retarded

Если ты добавляешь декоратор который подменяет существующий метод которым ктото уже пользуется, то наверное это не нормально, но это вопрос уже не к декораторам а к автору. Ну и всегда можно сделать func_new = decorator(func). Так что не вижу ничего криминального в общем случае.

zz ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.