Путь импорта для функции, обернутой декоратором?

Предполагая, что у меня есть декоратор и обернутая функция, подобная этой:

def squared(method):
    def wrapper(x, y):
        return method(x*x, y*y)
    return wrapper

@squared
def sum(x, y):
    return x+y

У меня есть другой код, который хотел бы вызвать недекорированную версию функции sum. Есть ли трюк с импортом, который может привести меня к этому развернутому методу? Если мой код говорит from some.module.path import sum, то я получаю завернутую версию метода sum, а это не то, что мне нужно в данном случае. (Да, я знаю, что мог бы превратить это в вспомогательный метод, но это частично нарушает чистоту шаблона, который я здесь использую.)

Я могу добавить в декоратор дополнительную «магию», чтобы предоставить какое-то альтернативное имя символа (например, orig_sum), которое я мог бы затем импортировать, я просто не знаю, как это сделать.


person slacy    schedule 10.02.2011    source источник


Ответы (2)


Что насчет этого?

def squared(method):
    def wrapper(x, y):
        return method(x*x, y*y)
    return wrapper

def sum(x, y):
    return x+y

squared_sum = squared(sum)

Это все еще декоратор, но вы по-прежнему можете импортировать squared и sum без всякой магии. Не уверен, что это то, что вы имели в виду под «вспомогательным методом», но я считаю, что это намного чище, чем метод sum, который фактически суммирует квадраты своих входов.

person Reiner Gerecke    schedule 10.02.2011
comment
Да, это, конечно, сработает, но у него нет чистоты синтаксиса декоратора Python. :) Как вы уже, наверное, догадались, я на самом деле не суммирую и не возвожу в квадрат свой код, это всего лишь синтетический пример, который иллюстрирует поведение, которое я хочу. Но ваша точка зрения верна, и, возможно, мне не следует использовать синтаксис @decorator. - person slacy; 10.02.2011
comment
поздно на вечеринку, но вы могли бы: @squared def squared_sum(x, y): вернуть сумму(x,y) - person Willyfrog; 21.12.2012

person    schedule
comment
Из другого исходного файла можно from foo.squared.wrapper import orig as sum? - person slacy; 10.02.2011
comment
@slacy, я должен сказать, что ИМО, то, что вы предлагаете, гораздо менее чисто, чем версия Райнера Гереке без декоратора. - person senderle; 10.02.2011
comment
Кстати, еще лучше было бы setattr(wrapped, method.__name__, method) :) - person slacy; 10.02.2011
comment
@slacy: в общем, насколько мне известно, нет - исходная функция похоронена в скомпилированном байт-коде. - person Hugh Bothwell; 10.02.2011
comment
Мне очень нравится, как вы используете помощника по развертыванию. На самом деле, можно сделать это декоратором... - person slacy; 10.02.2011