Как стать автором
Обновить

Комментарии 25

Мне кажется или начало второй части дублирует первую?
Или повторение — мать учения?
Не в том смысле, что написано теми же словами, но тезис, что
@decorator
def my_func(): pass

и
def my_funk():pass
my_funk = decorator(my_funk)

это одно и то же явно был в первой части.
Всё верно.
Я и указал, что, возможно, стоит «освежить память».

Плюс, в данном месте в текущей статье указывается на тот факт, что при декорировании фунцкии декоратором декоратор будет обязательно вызван, так как это просто функция.
Момент, при его осознании, очевидный, но не самоочевидный.)
А на КДПВ реальный код?

@staticmethod декорирует статические методы класса, первым аргументом котрых является переменная связанная с классом (обычно называется cls).
Тоесьт, аргумент filename будет связан с определением класса.
Я туплю. Попутал с @classmethiod.
НЛО прилетело и опубликовало эту надпись здесь
Это антипаттерн для питона — класс с одним методом __call__.
НЛО прилетело и опубликовало эту надпись здесь
Вообще в питоне функция — это обьект, как раз и поддерживающий инициализацию (ну оно же определение, кстати с той же реализацией примерно, что и у вас) и вызов. Таким образом вы обернули обьект (функцию) в точно такой же по структуре обьект (класс с двумя методами) без модификации поведения изначального (функции). То есть вы ввели ничего не делающую сущность. Ну и нафига она такая ничего не делающая?
Фу-фу-фу вам :)
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Это — общепринятый способ. Странно, почему вас напрягает повсеместно распространенный подход.
НЛО прилетело и опубликовало эту надпись здесь
1. Декоратор, реализованный классом, длиннее записывается и медленней работает.
2. Если вам захотелось вернуть None из декоратора — скорее всего что-то не так в архитектуре и декоратор используется не по назначению.
НЛО прилетело и опубликовало эту надпись здесь
Декоратор, возвращающий переданную ему функцию без изменений — это нормально.
Если же он возвращает None — это обескураживает.

@service(123)
def foo(a, b, c='d'):
pass

превращается в foo = None

Согласитесь, не самая очевидная запись. Я стараюсь избегать такого кода.
Лучше вернуть функцию с совместимой сигнатурой, которая будет выбрасывать исключение при вызове. Приемлемым вариантом было бы `del foo`, но из декоратора такое не сделаешь.

Если пишете декоратор на С — придется создавать классы. Для Питона это избыточно в подавляющем большинстве случаев.
Извините за оффтоп, но не могли бы вы сказать что за цветовая схема для idea (?)
Это sublime-text 2, насколько я понимаю. А схема — что-то похожее на Dark in pastels, но не уверен.
Схема Monokai
напишем декоратор декорирующий декоратор, декорирующий функции

Что-то это мне очень сегодняшнюю статью напоминает…
def counter(func):
    """
    Декоратор, считающий и выводящий количество вызовов
    декорируемой функции.
    """
    counter.count[func.__name__] = 0
    def wrapper(*args, **kwargs):
        counter.count[func.__name__] += 1
        res = func(*args, **kwargs)
        print "{0} была вызвана: {1}x".format(func.__name__, counter.count[func.__name__])
        return res
    return wrapper


Похоже, не хватает строки после декоратора
counter.count = {}

***
Посмотрел на StackOverflow. Ответ исправили, и получилось изящней:
def counter(func):
    """
    A decorator that counts and prints the number of times a function has been executed
    """
    def wrapper(*args, **kwargs):
        wrapper.count = wrapper.count + 1
        res = func(*args, **kwargs)
        print "{0} has been used: {1}x".format(func.__name__, wrapper.count)
        return res
    wrapper.count = 0
    return wrapper
Спасибо за замечание, действительно была ошибка + не самый разумный подход со словарём, исправил текст поста.)
Еще меня смущает запись:
str(reversed(string))

Выполнение этого выражения дает что-то вроде: "<reversed object at 0x10b0b2dd0>"

Предполагаю, что в старых версиях интерпретатора все работало верно. А возможно, автор использовал такую запись как псевдокод для наглядности. Попрошу знатаков разъяснить.

Возможные решения:
string[::-1]
# или
"".join(reversed(string))
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации