2013-07-12 137 views
0

我有一個代碼定義了幾個函數,我從主容器中調用代碼。每個新功能使用與以前的功能獲得的變量,所以看起來有點像這樣:通過函數之間的變量與全局變量

import some_package 
import other_package 

import first_function as ff 
import secon_function as sf 
import third_function as tf 
import make_plot as mp 

# Get values for three variables from first function 
var_1, var_2, var_3 = ff() 

# Pass some of those values to second function and get some more 
var4, var5 = sf(var_1, var_3) 

# Same with third function 
var_6, var_7, var_8, var_9 = tf(var_2, var_4, var_5) 

# Call plotting function with (almost) all variables 
mp(var_1, var_2, var_3, var_5, var_6, var_7, var_8, var_9) 

這是比使用全局變量更Python的?這種方法的問題是,如果我從一個給定的函數中添加/刪除一個新變量,我不得不修改四個地方:函數本身,在主代碼中調用該函數,調用make_plot函數主要和make_plot函數本身。有沒有更好或更推薦的方法來做到這一點?

+2

聲音像你需要定義一些對象(即創建一些類)的屬性,然後傳遞這些對象。 –

回答

1

把他們放在課堂上怎麼樣?

class Foo(object): 
    def ff(self): 
     self.var_1, self.var_2, self.var_3 = ff() 
    def sf(self): 
     self.var_4, self.var_5 = sf(self.var_1, self.var_2) 
    def tf(self): 
     self.var_6, self.var_7, self.var_8, self.var_9 = tf(self.var_2, self.var_4, self.var_5) 
    def plot(self): 
     mp(self.var_1, self.var_2, self.var_3, 
      self.var_5, self.var_6, self.var_7, self.var_8, self.var_9) 

foo = Foo() 
foo.ff() 
foo.sf() 
foo.tf() 
foo.plot() 

也許一些方法應該是採取Foo例如模塊級的功能,也許一些屬性應該在單獨傳遞的變量,也許真的有2,甚至4,不同類別在這裏,而比1等,但這個想法 - 你已經取代了9個東西來傳遞1或2.

+1

對於*有用的名稱*和/或*集合*,這看起來似乎毫無意義。 – user2246674

+0

@ user2246674:當然。而且,具體解釋起來也容易得多,而不必說「也許這個,也許這個,也許是另一個,取決於你正在處理的實際事情。」 – abarnert

0

我建議你想要的是一個數據結構,它由各種函數填充,然後在最後傳遞給make_plot。這在很大程度上適用於您使用的任何語言。