модификаторы функции обратного пассажира на Python2.1

StackOverflow https://stackoverflow.com/questions/1159023

  •  18-09-2019
  •  | 
  •  

Вопрос

У меня есть какой -то код, который я разработал в 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
Надеюсь, это поможет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top