Комментарии 25
Мне кажется или начало второй части дублирует первую?
Или повторение — мать учения?
Или повторение — мать учения?
0
Не в том смысле, что написано теми же словами, но тезис, что
и
это одно и то же явно был в первой части.
@decorator
def my_func(): pass
и
def my_funk():pass
my_funk = decorator(my_funk)
это одно и то же явно был в первой части.
0
А на КДПВ реальный код?
@staticmethod декорирует статические методы класса, первым аргументом котрых является переменная связанная с классом (обычно называется cls).
Тоесьт, аргумент filename будет связан с определением класса.
@staticmethod декорирует статические методы класса, первым аргументом котрых является переменная связанная с классом (обычно называется cls).
Тоесьт, аргумент filename будет связан с определением класса.
-1
НЛО прилетело и опубликовало эту надпись здесь
Это антипаттерн для питона — класс с одним методом __call__.
0
НЛО прилетело и опубликовало эту надпись здесь
Вообще в питоне функция — это обьект, как раз и поддерживающий инициализацию (ну оно же определение, кстати с той же реализацией примерно, что и у вас) и вызов. Таким образом вы обернули обьект (функцию) в точно такой же по структуре обьект (класс с двумя методами) без модификации поведения изначального (функции). То есть вы ввели ничего не делающую сущность. Ну и нафига она такая ничего не делающая?
Фу-фу-фу вам :)
Фу-фу-фу вам :)
+1
1. Декоратор, реализованный классом, длиннее записывается и медленней работает.
2. Если вам захотелось вернуть None из декоратора — скорее всего что-то не так в архитектуре и декоратор используется не по назначению.
2. Если вам захотелось вернуть None из декоратора — скорее всего что-то не так в архитектуре и декоратор используется не по назначению.
0
НЛО прилетело и опубликовало эту надпись здесь
Декоратор, возвращающий переданную ему функцию без изменений — это нормально.
Если же он возвращает None — это обескураживает.
@service(123)
def foo(a, b, c='d'):
pass
превращается в foo = None
Согласитесь, не самая очевидная запись. Я стараюсь избегать такого кода.
Лучше вернуть функцию с совместимой сигнатурой, которая будет выбрасывать исключение при вызове. Приемлемым вариантом было бы `del foo`, но из декоратора такое не сделаешь.
Если пишете декоратор на С — придется создавать классы. Для Питона это избыточно в подавляющем большинстве случаев.
Если же он возвращает None — это обескураживает.
@service(123)
def foo(a, b, c='d'):
pass
превращается в foo = None
Согласитесь, не самая очевидная запись. Я стараюсь избегать такого кода.
Лучше вернуть функцию с совместимой сигнатурой, которая будет выбрасывать исключение при вызове. Приемлемым вариантом было бы `del foo`, но из декоратора такое не сделаешь.
Если пишете декоратор на С — придется создавать классы. Для Питона это избыточно в подавляющем большинстве случаев.
+3
Извините за оффтоп, но не могли бы вы сказать что за цветовая схема для idea (?)
0
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
+1
Спасибо за замечание, действительно была ошибка + не самый разумный подход со словарём, исправил текст поста.)
+1
Еще меня смущает запись:
Выполнение этого выражения дает что-то вроде: "<reversed object at 0x10b0b2dd0>"
Предполагаю, что в старых версиях интерпретатора все работало верно. А возможно, автор использовал такую запись как псевдокод для наглядности. Попрошу знатаков разъяснить.
Возможные решения:
str(reversed(string))
Выполнение этого выражения дает что-то вроде: "<reversed object at 0x10b0b2dd0>"
Предполагаю, что в старых версиях интерпретатора все работало верно. А возможно, автор использовал такую запись как псевдокод для наглядности. Попрошу знатаков разъяснить.
Возможные решения:
string[::-1]
# или
"".join(reversed(string))
+1
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Понимаем декораторы в Python'e, шаг за шагом. Шаг 2