2012-04-03 192 views
-1

我知道爲什麼這是一個壞主意,但這似乎是一個很好的例子,我想聽聽爲什麼我錯了,以及我的替代品是什麼。python:「從模塊導入*」的情況?

我有充滿核心邏輯的thing.py。

我有appthing.py,它希望使用該邏輯,同時爲我們使用的環境添加一些特定於應用程序的事物,例如通過應用程序的內置持久存儲功能保存關於所述邏輯的用戶設置。 py會與之交互以恢復狀態,等等。

我可以(在我看來):

  1. 重複thing.py在appthing.py函數名;這些調用原件
  2. 電話的事情,他們是:appthing.func1,appthing.thing.func2等
  3. 進口都在從進口的東西莫名其妙*
  4. 並行使用它們,並與appthing.funcs到處
  5. 工作

我不想做1 - 我討厭重複的代碼/工作。 2似乎是一個忍耐(appthing.settingA成爲appthing.thing.settingA)。總的來說,3似乎是一個糟糕的主意。這留下了4,導入*,我知道這是錯誤的,但在這種情況下,它似乎沒問題。

你說什麼?我的選擇5是什麼?謝謝。

我應該注意,在任何地方都沒有任何類。我試圖打破所有地方上課的習慣。這些都不需要它,所以簡單地在模塊之間進行子類化。

+1

您可以提供一個簡短的代碼樣例來代替文字說明嗎? – 2012-04-03 08:43:05

+1

請閱讀有關問題的常見問題部分不要問。這個問題徵求意見,並沒有正確的答案,所以它不被認爲是這個網站的主題。 – agf 2012-04-03 08:57:27

+0

對不起,agf。我認爲這是一個正確的答案,即處理這個特定問題的標準方法。這就是我所期望的選項5。 – 2012-04-03 09:20:17

回答

2

5)進口只有你知道你將使用

6)一路走與面向對象,使thingappthing類,函數,其中來自thing


appthing繼承選擇是你的,真的。你認爲最好的是什麼?尤其要考慮維護代碼的必要性。如果thing需要更改某些功能,會發生什麼情況?這怎麼影響appthing的用戶?

在你的情況,我可能會選擇自己的選項5.這樣,它的明確什麼我繼承和thing的變化不影響appthing可以在不使用我去appthing通過代碼進行。

我不會去1號,因爲這真的很麻煩。務實,並選擇一個規模可以輕鬆維護的設計。

+0

謝謝,埃米爾。我絕對避免數字1. – 2012-04-03 09:26:32

1

,最好的辦法是做:

from mymodule.thing import my_settings as settings 
#... 
# use the name settings everywhere in this client code 

這樣,你只有一個地方,如果你mymodule界面的變化(DRY原則)來更新。

選項4(from mymodule import *)使您的客戶端代碼易於在未來mymodule中的任何更改,並且還引入了名稱衝突的機會。如果您確信不會發生名稱衝突,並且您不會經常更新您的「核心」模塊,那麼就沒問題;請注意,客戶端代碼中存在直接依賴關係。

1

這是可以接受的地方,你有一個模塊,只提供可以在導入模塊中看到的東西,以及只有一個這樣的模塊。

例如,在我的Django的項目,我喜歡一切從models導入views,這在我所有的車型帶來的,和其他類,如Django自己的User類爲不合格的名字到視圖代碼。這很方便,因爲view模塊將始終連接到models模塊。我不會爲任何其他模塊配對。

+0

謝謝,馬辛。這裏的困難在於appthing.py中只有很少的東西 - 它只是添加了一些東西,比如保存設置。我只是把它們放在thing.py中,但是在庫級代碼中有特定於應用程序的代碼,我必須嘗試/除非在周圍,否則會變得非常混亂。我真的不想導入*。我只想在應用程序中添加一些額外的功能,添加到thing.py中。 thing.py是非常低級的東西。它從別的地方進口。 – 2012-04-03 09:29:08

+0

@GaryFixler聽起來好像你已經考慮過這一點,並認爲它不太可能會導致問題。去吧。你的選擇是使用類似django conf系統的東西來將模塊中的所有變量複製到對象中。 – Marcin 2012-04-03 09:32:27