backport函数修饰符到python2.1

时间:2009-07-21 12:57:51

标签: python syntax backport

我有一些我在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中寻找一些函数修饰符定义,但我找不到(我的意思是:工作)。有人成功解决了这个问题吗?

更具体一点,我需要一种在python 2.1中运行这个2.4代码的方法:

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 个答案:

答案 0 :(得分:2)

就像我在2.1静态方法的旧配方中一样:

class staticmethod:
    def __init__(self, thefunc): self.f = thefunc
    def __call__(self, *a, **k): return self.f(*a, **k)

你应该能够做一个2.1课程方法:

class classmethod:
    def __init__(self, thefunc): self.f = thefunc
    def __call__(self, obj, *a, **k): return self.f(obj.__class__, *a, **k)

@ - 当然是语法,而是旧的方式(如2.2中):

class sic:
  def f(cls): ...
  f = classmethod(f)

如果这不起作用(对不起,自从我有一个Python 2.1进行测试已经很多年了),需要更明确地提供类 - 并且因为在类对象存在之前调用classmethod,所以将需要通过名称 - 假设一个全球类,

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')

很难找到获得类对象的优雅方法(抑制对self的需求是容易的部分,对于staticmethod来说足够了:你只需要将函数包装成非函数可调用的)因为2.1只有遗产(旧式类),没有可用的元类,因此没有真正好的方法让sic2.f()神奇地获得那些cls。

由于2.1中缺少@语法不可避免地要求编辑使用@classmethod的代码,另一种方法是将功能(将某些方法装饰为“类”)转移到{{ {1}}语句(优点是类对象确实存在)。

class

答案 1 :(得分:1)

如果只需要将@class方法反向移植到Python 2.1 有一个recipe of Classmethod emulation in python2.1 希望这有帮助。