Как я могу использовать Decorator для импортируемой функции? [Дубликат]

Как насчет этого:

sentence = 'After 1500 years of that thinking surpressed'

sentence = sentence.lower()

def removeLetter(text,char):

    result = ''
    for c in text:
        if c != char:
            result += c
    return text.replace(char,'*')
text = removeLetter(sentence,'a')
15
задан Martijn Pieters 16 May 2017 в 09:03
поделиться

1 ответ

Декораторы - это просто синтаксический сахар, чтобы заменить функциональный объект украшенной версией, где украшение - это просто вызов (передача в исходном объекте функции). Другими словами, синтаксис:

@decorator_expression
def function_name():
    # function body

грубо (*) переводится на:

def function_name():
    # function body
function_name = decorator_expression(function_name)

В вашем случае вы можете применить свой декоратор вручную вместо:

from random import randint

randint = decorator(randint)

(*) При использовании функции @<decorator> для функции или класса результат определения def или class не связан (назначается их имени в текущем пространстве имен). Декоратор передается объекту непосредственно из стека, и тогда только результат вызова декоратора привязывается.

22
ответ дан Martijn Pieters 18 August 2018 в 18:44
поделиться
  • 1
    Единственная проблема заключается в том, что имя docstring и метода не сохраняется. Возможно, вы хотите использовать functools.wraps – pratikm 1 March 2016 в 22:06
  • 2
    @pratikm: это отдельная проблема. Декоратор должен действительно использовать functools.wraps, но это не изменит, как вы можете применить декоратор. – Martijn Pieters♦ 1 March 2016 в 23:39
  • 3
    Это, похоже, не работает для декораторов колбу. Это @app.route('/route', methods=['GET']). – CMCDragonkai 27 July 2018 в 05:41
  • 4
    @CMCDragonkai: он отлично подходит для декораторов цветочных дорожек, если вы вызываете результат фабрики декоратора: app.route('/route', methods=['GET'])(view_func) (нет необходимости записывать возвращаемое значение, так как декор app.route() регистрируется и возвращает функцию просмотра без изменений). Не то чтобы вы это делали, так как вы могли просто использовать app.add_url_rule() вместо: app.add_url_rule('/route', view_func.__name__, view_func, methods=['GET']). – Martijn Pieters♦ 27 July 2018 в 09:36
Другие вопросы по тегам:

Похожие вопросы: