2011-12-09 61 views
2

在Python中,動態加載模塊,你可以簡單地使用_____import_____語句和模塊分配給一個變量,即(從文檔):等價於Ruby中的Python動態導入語句?

spam = __import__('spam', globals(), locals(), [], -1) 

我已經使用了好幾次在python爲了模擬動態模塊加載/卸載,因爲要「卸載」的模塊,你可以簡單地刪除所有對它的引用,即:

spam = None 

是否有一個相當於這個在Ruby中?我看了其他幾個問題(this,thisthis),但我想知道一種方法來限制加載的模塊到變量,如果可能的話。

回答

3

這是做你想做的嗎?

require 'bigdecimal/math' # a module from stdlib 
bm = BigMath # a module is just an object 
BigMath = nil # yields a warning, but BigMath is gone. 
puts bm.log(10, 40).to_s # it's alter ego lives. 
#=> 0.230258509299404568401799145468436420760110148862877297632502494462371208E1 
+0

經過一番測試,你提出的方法似乎工作得最好,但我不喜歡它。即使使用remove_const來自行清理,它看起來並不是很好的做法。我不喜歡Ruby忽視將導入的文件視爲Python自己的對象(因爲這樣做是有道理的,恕我直言)。沒錯,許多其他語言似乎不會讓你做這個比Ruby更多的東西。但我想我會考慮重新設計而不是做這樣的事情 - 它只是覺得太過分了。 – WilHall

+0

這不是特別黑客。模塊定義了一個對象,然後你可以用你喜歡的對象來完成。 –

+0

呃,我覺得額外的步驟是一個標誌,它並不是首先要做的。所以我會避免它。 – WilHall

0

不,不可能。如果您使用的是requireload文件,則可以將該文件導入到全局名稱空間中。

+0

實際上,如果您使用第二個參數「wrap」,'load'不會將代碼加載到全局名稱空間中,該代碼將執行匿名模塊中的代碼。但是由於沒有辦法(我知道)訪問這個匿名模塊,所以幾乎沒有區別。另外,全局變量仍然會污染全局名稱空間。 – riffraff

1

據我所知,紅寶石並沒有真正有一個單一的出口對象,一個require d文件可以分配給一個變量的概念;因此,我不明白你會如何做到這一點。

但是,請注意,您仍然可以使用諸如remove_const之類的內容來取消定義已加載的類。