我有一些我在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
>>>
答案 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 希望这有帮助。