我正在開發一個Python項目,其中以前的開發人員將大部分代碼放在基本__init__.py
文件中。我希望能夠將代碼從文件移動到子目錄中的新文件。將代碼移出__init__.py,但保持向下兼容性
spam/
__init__.py
foobar/
__init__.py
eggs.py
因此,導入垃圾郵件模塊將使用foobar/eggs.py中的代碼。
我想保持100%的兼容性,因爲當前實現垃圾郵件的代碼無法更改。
我正在開發一個Python項目,其中以前的開發人員將大部分代碼放在基本__init__.py
文件中。我希望能夠將代碼從文件移動到子目錄中的新文件。將代碼移出__init__.py,但保持向下兼容性
spam/
__init__.py
foobar/
__init__.py
eggs.py
因此,導入垃圾郵件模塊將使用foobar/eggs.py中的代碼。
我想保持100%的兼容性,因爲當前實現垃圾郵件的代碼無法更改。
100%的兼容性可能是不可能的。一些事情(如泡菜)真的關心什麼是定義的東西。
通過導入__init__.py
文件中的類別/函數,可以獲得大多數兼容性。
在垃圾郵件中添加from foobar import *
/__ init__.py應該足以讓所有內容都處於與之前相同的範圍。或者,如果您需要更改名稱或限制導出的內容,則可以重新定義您需要導出到同一文件中的所有內容,例如foo = foobar.newfoo
。
當然,離開在全球範圍內依然擁有一切的問題,但如果你需要它看起來相同的外部,你不能做這個。
垃圾郵件的__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)
當然......這很有效。我不知道爲什麼我沒有想到這一點。謝謝。 – user580777 2011-03-25 01:24:57
爲了讓在提到泡菜問題更詳細一點:老鹹菜將與新的佈局工作(他們會看到'__init __ py'參考進口。),但新的佈局產生的泡菜不會與舊的使用代碼版本(因爲'spam.foobar'及其內容在這些版本中不存在)。接受任意類的實例其他序列化方案將可能有類似的問題。 – ncoghlan 2011-03-25 04:17:49