Некоторое время назад, в силу определенных причин, мне пришла в голову мысль о том, чтобы начать изучать какой-нибудь новый язык программирования. В качестве альтернатив для этого начинания я определил два языка: Java и Python. После продолжительного метания между ними и сопутствующих нытья и долбежки головой о стену (у меня с новыми языками всегда так — сомнения, раздумья, проблема выбора и т.д.), я все-таки остановился на Python. Окей, выбор сделан. Что дальше?
Читать полностью »
Метка «декораторы»
Python на Хабре
2013-12-18 в 6:12, admin, рубрики: django, GIL, pygtk, pyqt4, python, python3, tkinter, tornado, twisted, wxpython, декораторы, обучение, Программирование, метки: Django, GIL, pygtk, pyqt4, python, python3, tkinter, tornado, twisted, wxpython, декораторы, обучениеPython: декорируем декораторы. Снова
2013-07-23 в 15:28, admin, рубрики: python, горшочек-не-вари, декораторы, функциональное программирование, метки: python, горшочек-не-вари, декораторы, функциональное программирование В прошлом году на Хабре уже была очень развёрнутая статья в двух частях о декораторах. Цель этой новой статьи — cut to the chase и сразу заняться интересными, осмысленными примерами, чтобы успеть затем разобраться в примерах ещё более мудрёных, чем в предыдущих статьях.
Целевая аудитория — программисты, уже знакомые (например по C#) с функциями высшего порядка и с замыканиями, но привыкшие, что аннотации у функций — это «метаинформация», проявляющаяся только при рефлексии. Особенность Питона, сразу же бросающаяся в глаза таким программистам — то, что присутствие декоратора перед объявлением функции позволяет изменить поведение этой функции:
Как это работает? Читать полностью »
Декораторы в PHP
2013-05-24 в 11:22, admin, рубрики: decorators, extension, php, декораторы, метки: decorators, extension, PHP, декораторы
Решил поделиться своим видением и наработками по реализации python-style декораторов в PHP.
В качестве завлекалочки небольшой пример использования на изображении справа. Выводит (после реализации логики самих декораторов):
Log: calling b() int(42)
Реализация выполнена в виде C расширения и не требует пересборки самого PHP. Но не заведется на хостингах, где нельзя загрузить свою so'шку.
На данный момент код находится в стадии беты (весь нужный функционал написан, но баги и утечки памяти наверняка есть :) ). Так что as is. Ну а если есть желание помочь в развитии, то буду рад принять коммиты на github.
Читать полностью »
Добавляем чуть больше рефлексии: декораторы
2013-04-25 в 20:00, admin, рубрики: decorators, python, декораторы, рефлексия, метки: decorators, python, декораторы, рефлексияПоследнее время приходится довольно много работать с Python. Решая одну из текущих задач, возникла необходимость внутри функции-декоратора проверить задекорирован ли декорируемый метод другим декоратором. К сожалению, стандартные средства рефлексии языка не позволяют это сделать. Точнее, используя, например, модуль inspect из стандартной библиотеки это сделать можно, но уж больно не нравился такой подход.
Под катом свой метод решения задачи, вылившийся в небольшую библиотеку, доступную для общего пользования.
Читать полностью »
Декоратор cached_property
2012-11-18 в 9:38, admin, рубрики: django, property, python, декораторы, метки: Django, property, python, декораторыКак часто вы пишете такие конструкции?
class SomeClass(object):
@property
def param(self):
if not hasattr(self, '_param'):
self._param = computing()
return self._param
@param.setter
def param(self, value):
self._param = value
@param.deleter
def param(self):
del self._param
Это очень удобно, значение атрибута param при таком подходе не хранится напрямую в объекте, но и не вычисляется каждый раз. Вычисление происходит при первом обращении, и это значение сохраняется в объекте под временным именем _param. Если меняются условия, от которых зависит значение param, его можно удалить, и тогда оно снова вычислится при следующем обращении. Или можно сразу присвоить актуальное значение, если таковое известно.
У этого кода есть и минусы: у объекта появляется лишний атрибут с именем _param; при каждом обращении к атрибуту вызывается метод param(), который делает проверку hasattr; получившийся код достаточно большой, особенно если таких атрибутов в классе несколько.
Читать полностью »