модификаторы функции обратного пассажира на Python2.1
Вопрос
У меня есть какой -то код, который я разработал в Python 2.4 ++, и вы держите пари, я должен вернуть его на Python 2.1!
Функциональные декораторы были настолько привлекательны, что я использовал @classmethod в нескольких местах, не обращая внимания на тот факт, что он доступен только начиная с версии 2.4. Такая же функциональность предлагается модификаторами функций, но они появились в Python 2.2. CFR: http://www.python.org/dev/peps/pep-0318/
Теперь некоторые из наших клиентов, похоже, все еще зависят от Python 2.1 (ArcGIS 9.1 поставляется с ним и делает его не обновляемым), где даже модификаторы функций доступны ...
Я искал некоторые определения модификаторов функции в Python 2.1, но я не нашел (я имею в виду: работа). Кто -нибудь успешно решил эту проблему?
Чтобы быть более конкретным, мне нужен способ запустить этот код 2.4 в Python 2.1:
Python 2.4.6 (#2, Mar 19 2009, 10:00:53)
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> class sic:
... def f(cls):
... print cls.__name__
... f = classmethod(f)
...
>>> sic().f()
sic
>>> sic.f()
sic
>>>
Решение
Как и в моем старом рецепте для 2.1 Staticmethod:
class staticmethod:
def __init__(self, thefunc): self.f = thefunc
def __call__(self, *a, **k): return self.f(*a, **k)
Вы должны быть в состоянии сделать 2.1 Classmethod как:
class classmethod:
def __init__(self, thefunc): self.f = thefunc
def __call__(self, obj, *a, **k): return self.f(obj.__class__, *a, **k)
Нет @
-Syntax конечно, а скорее старый путь (как в 2.2):
class sic:
def f(cls): ...
f = classmethod(f)
Если это не сработает (извините, было много лет с тех пор, как у меня был Python 2.1 для тестирования), класс должен быть предоставлен более явным быть по имени - принять глобальный класс,
class classmethod2:
def __init__(self, thefunc, clsnam):
self.f = thefunc
self.clsnam = clsnam
def __call__(self, *a, **k):
klass = globals()[self.clsnam]
return self.f(klass, *a, **k)
class sic2:
def f(cls): ...
f = classmethod2(f, 'sic2')
Действительно трудно найти элегантные способы получить объект класса (подавление потребности в себе-это легкая часть, и того, что достаточно для Staticmethod: вам просто нужно обернуть функцию в нефункциональную вызов), поскольку 2.1 имело только наследие (старое -Лы классы), без использования Metaclass, и, следовательно, нет действительно хорошего способа, чтобы SIC2.f () волшебным образом получил этот CLS.
Поскольку отсутствие синтаксиса @ в 2.1 неизбежно требует редактирования кода, который использует @classmethod
, Альтернатива состоит в том, чтобы переместить функциональность (украшение некоторых методов, чтобы быть «классовыми») на сразу после окончания class
Заявление (преимущество заключается в том, что объект класса существует в то время).
class classmethod3:
def __init__(self, thefunc, klass):
self.f = thefunc
self.klass = klass
def __call__(self, *a, **k):
return self.f(self.klass, *a, **k)
def decorate(klass, klassmethodnames):
for n in klassmethodnames:
thefunc = klass.__dict__[n]
setattr(klass, n, classmethod3(thefunc, klass))
class sic2:
def f(cls): ...
def g(self): ...
def h(cls): ...
decorate(sic2, ['f', 'h'])
Другие советы
Если просто @classmethod нужно переоценить в Python 2.1.
Eсть Рецепт эмуляции класса в Python2.1
Надеюсь, это поможет.