我有一個非常大的Python 2.7.6項目,我需要將其轉換爲Python 3.4。我用2to3腳本,但'元類'處理似乎被打破。使用元類將Python2轉換爲Python3導致錯誤流程
我過濾了代碼以縮短並查明問題。
class Base(object):
class __metaclass__(type):
def __new__(cls, classname, bases, dict):
new = type.__new__(cls, classname, bases, dict)
new.classname = classname
print ("Base::__metaclass__::new. Called.")
return new
class Heir(Base):
class __metaclass__(Base.__metaclass__):
def __new__(self, *args):
new = Base.__metaclass__.__new__(self, *args)
print ("Heir::__metaclass__::new. Called.")
return new
@classmethod
def define(cls, nexttype):
print ("Heir::define. Called.")
class HeirOfHeir(Heir):
pass
Heir.define(HeirOfHeir)
代碼打印效果與預期:
Base::__metaclass__::new. Called.
Base::__metaclass__::new. Called.
Heir::__metaclass__::new. Called.
Base::__metaclass__::new. Called.
Heir::__metaclass__::new. Called.
Heir::define. Called.
但與Python 3.4中運行的代碼時,我只有最後一次打印:
Heir::define. Called.
下面的片段與Python 2.7.6效果很好
2to3
錯誤計算或需要一些手動工作。不幸的是,我對元類沒有多少經驗。
我還建議第六單元(https://pythonhosted.org/six/)用於編寫與Py2和Py3兼容的代碼。在這種情況下,你只需要在class Heir定義之前使用'@ six.add_metaclass(HeirMeta)'裝飾器。 – 2015-02-24 14:25:09
我無法使用任何編碼範例,因爲整個項目非常龐大,需要太多時間才能使其兼容2/3。但是我有大約12-15個模塊,只有元類,我會嘗試採用上述方法。 – OGP 2015-02-25 04:56:42