2011-03-25 41 views
5

我正在開發一個Python項目,其中以前的開發人員將大部分代碼放在基本__init__.py文件中。我希望能夠將代碼從文件移動到子目錄中的新文件。將代碼移出__init__.py,但保持向下兼容性

spam/ 
    __init__.py 
    foobar/ 
     __init__.py 
     eggs.py 

因此,導入垃圾郵件模塊將使用foobar/eggs.py中的代碼。

我想保持100%的兼容性,因爲當前實現垃圾郵件的代碼無法更改。

回答

3

100%的兼容性可能是不可能的。一些事情(如泡菜)真的關心什麼是定義的東西。

通過導入__init__.py文件中的類別/函數,可以獲得大多數兼容性。

+0

當然......這很有效。我不知道爲什麼我沒有想到這一點。謝謝。 – user580777 2011-03-25 01:24:57

+0

爲了讓在提到泡菜問題更詳細一點:老鹹菜將與新的佈局工作(他們會看到'__init __ py'參考進口。),但新的佈局產生的泡菜不會與舊的使用代碼版本(因爲'spam.foobar'及其內容在這些版本中不存在)。接受任意類的實例其他序列化方案將可能有類似的問題。 – ncoghlan 2011-03-25 04:17:49

0

在垃圾郵件中添加from foobar import */__ init__.py應該足以讓所有內容都處於與之前相同的範圍。或者,如果您需要更改名稱或限制導出的內容,則可以重新定義您需要導出到同一文件中的所有內容,例如foo = foobar.newfoo

當然,離開在全球範圍內依然擁有一切的問題,但如果你需要它看起來相同的外部,你不能做這個。

0

垃圾郵件的__init__.py,你可以導入foobar.egg的東西,當地的,那麼任何人都免受垃圾郵件導入它仍然可以訪問它

from foobar.eggs import apples_newname as apples_oldname 
# or (but import * isn't recommended except for extreme cases) 
from foobar.eggs import * 

,你也可以編寫包裝函數在垃圾郵件__init__。 py,它簡單地稱爲具有擴展兼容性的特定情況下的蛋等效物

import foobar.eggs 
def apples_newname(*args, **kwargs): 
    foobar.eggs.apples_oldname(*args, **kwargs)