2013-07-18 27 views
1

我寫在Python一塊科學的軟件的方法,包括兩者的泊松方程求解器(使用牛頓法)上的矩形網格,和一個粒子在細胞代碼。我將牛頓求解器和粒子單元內代碼編寫爲獨立函數,這些函數由我的主腳本調用。如何處理全局參數在科學Python腳本

我原本寫的代碼作爲一個大的腳本,但決定分手的腳本,使其更加模塊化,並且使各個功能可以在自己被調用。我的問題是我有大量的「全局」變量,我認爲這個問題的參數。這主要包括定義問題幾何和網格的問題常量和參數(例如尺寸,某些邊界條件的位置,邊界條件等)。

這些參數對主腳本和各個函數都是必需的。我的問題是:什麼是存儲這些變量的最佳方式(也是最合適的),以便主腳本和函數都可以訪問這些變量。

我目前的解決方案是定義在一個單獨的模塊(parameters.py)一類像這樣:

class Parameters: 
    length = 0.008 
    width = 0.0014 

    nz = 160 
    nr = 28 

    dz = length/nz 
    dr = width/nr 
    ... 

在我的主要腳本然後我有:

from parameters import Parameters 

par = Parameters() 

coeff_a = -2 * (1/par.dr**2 + 1/par.dz**2) 
... 

這種方法可以讓我然後使用par作爲我的參數的容器,它可以傳遞給我想要的任何函數。它還提供了一種簡單的方法來輕鬆設置問題空間,以便僅運行其中一個功能。我唯一擔心的是每個函數都不需要存儲在par中的所有內容,因此它總是向前傳遞它似乎效率低下。我可能會從par中刪除很多參數,但是每次調用函數時都需要重新計算它們,這似乎更加低效。

是否有人們在這些場景中使用的標準解決方案?我應該提到,我的職能並沒有改變票面的屬性,只是閱讀它們。如果可能的話,我也對獲得高性能感興趣。

回答

0

一般來說,當你的程序需要在不同的地方很多參數,它是有道理拿出一個整潔的配置系統,通常是提供某種接口來自己的代碼的類。

在實例化該類時,您有一個可以傳遞的配置對象。在某些地方你可能想要使用它,在其他地方你可能想使用它。無論如何,這個配置對象將是全局訪問的。如果你的程序是一個Python包,那麼這個配置機制可能被寫入它自己的模塊中,你可以從你的包中的所有其他模塊導入。

配置類可能提供有用的功能,例如參數註冊(一定代碼段說,它需要一定的參數被設定),缺省值和參數驗證的定義。然後

的參數的實際人口是基於默認值,用戶指定的命令行參數或用戶指定的輸入文件。

0

爲了揚菲利普Gehrcke的回答更加形象化,請A global class pattern for python(順便說一句:這只是一個普通的類,沒有什麼特別的‘全局’ - 但你可以圍繞它傳遞‘全球’)。

之前在我自己的程序實際執行此,我有同樣的想法,但想找出別人會怎麼做(比如提問李啓)。對於首先實現這一點我有點懷疑,特別是在模塊本身中實例化一個類看起來很奇怪。但它工作正常。

然而,有一些事情要記住,雖然:

  • 這是不是超級乾淨。例如,某個不知道模塊中的功能的人不會期望需要設置配置類中的參數
  • 如果您必須重新加載模塊/功能但想要維護在您的模塊中設置的值配置類,則不應再次實例化配置類:if "mem" not in locals(): mem = Mem()
  • 建議不要將您的配置類中的參數指定爲函數的默認參數。例如function(a, b=mem.defaultB)。 初始化後不能更改此默認值。相反,做function(a, b=None): if b is None: b=mem.defaultB。然後,您還可以在加載模塊/函數後調整配置類。
  • 當然還有更多問題...