2013-06-28 54 views
2

從模塊中暴露變量的最佳方式是什麼?如何在Python模塊中暴露變量?

import otherDBInterface as odbi 

def create(host): 
    global connection 
    global cursor 
    connection = odbi.connect(host) 
    cursor = connection.cursor() 
    ... 

我要揭露cursor變量的模塊中,所以我可以做類似mydb.cursor.execute("select * from foo;")。我認爲使用global關鍵字會做到這一點,但沒有這樣的運氣。 cursor是一個對象,所以我不知道我將如何聲明它,以便它會被暴露。

+1

應該這樣做,但顯然你需要在'cursor'存在之前調用'create'函數。你可以在你試圖導入/使用'cursor'對象的地方顯示代碼嗎? – BrenBarn

+0

'mydb'是模塊名稱嗎? – falsetru

+0

是的,在這個例子中,'mydb'是模塊名稱。 –

回答

4

您可以在一個類

class Database: 

    def __init__(self, **kwargs): 

     if kwargs.get("connection") is not None: 

      self.connection = kwargs["connection"] 

     elif kwargs.get("host") is not None: 

      self.connection = odbi.connect(host) 
      self.cursor = self.connection.cursor() 

mydb = Database(host="localhost") 

results = mydb.cursor.execute("select * from foo") 

#or use it with a connection 

mydb = Database(connection="localhost") 

results = mydb.cursor.execute("select * from foo") 
+2

+1來對付無法解釋的匿名downvote。封裝在一個對象中比全局變量好得多,而且通常更適合引導。 – tripleee

+0

有沒有辦法在Python類中有兩個「構造函數」?我需要一個'connect()'構造函數來連接一個現有的數據庫和一個'create()'構造函數來從頭構建一個數據庫。 –

+0

你所要求的稱爲方法重載,像Java這樣的語言有這個,但不是Python。在Python中你可以使用動態參數。 – John

1

在模塊級創建的任何變量默認情況下「暴露」包裝你的連接信息。

因此,像這樣的模塊將有三個暴露的變量:

configpath = '$HOME/.config' 

class Configuration(object): 

    def __init__(self, configpath): 
     self.configfile = open(configpath, 'rb') 

config = Configuration(configpath) 

的變量是configpathConfigurationconfig。所有這些都可以從其他模塊導入。您還可以使用 s configfile作爲config.configfile

您也可以CONFIGFILE訪問全局是這樣的:

configpath = '$HOME/.config' 
configfile = None 

class Configuration(object): 

    def __init__(self, configpath): 
     global configfile 
     configfile = open(configpath, 'rb') 

config = Configuration(configpath) 

但也有各種棘手的問題,這一點,因爲如果你從另一個模塊得到configfile手柄和它,然後會從Configuration內更換您的原來的句柄不會改變。因此這隻適用於可變對象。

在上面的例子中,這意味着以這種方式使用configfile作爲全局將不會很有用。但是,使用config就可以。