2010-08-10 134 views
0

示例代碼從一個模塊:如何在Python中使用具有相同名稱的命名參數和全局變量?

somevar = "a" 

def myfunc(somevar = None): 
    # need to access both somevars ??? 
    # ... if somevar was specified print it or use the global value 
    pass 

if __name__ == '__main__': 
    somevar = "b" # this is just for fun here 
    myfunc("c") 
    myfunc() # should print "a" (the value of global variable) 

至少有兩個原因使用相同的名稱:教育(學習如何使用本地/全局)和使用在模塊。

讓我們說這個代碼是你的模塊的一部分:mymodule和你想要做的事情,如:

import mymodule 

mymodule.samevar = "default" 
... 
mymodule.myfunc(somevar = "a") 
... 
mymodule.myfunc() 

正如你在這個例子被簡化想象,想象somevar參數是許多可選的一個參數,並且myfunc在許多地方被調用。

+1

您是否嘗試過關鍵詞'global'和'local'? – NickHalden 2010-08-10 17:13:15

+1

第二個電話應該真的打印「C」,還是應該是「a」? – theomega 2010-08-10 17:19:20

+0

@theomega:謝謝你的評論,我糾正了這個例子。 – bogdan 2010-08-11 09:33:46

回答

5

到目前爲止,最好的方法,因爲其他的答案說,就是要避免這種情況非常,非常糟糕的設計:只是不使用兩個不同的東西一樣的名字!

如果你被困在這個可怕的設計中,可能是因爲你公司的最高架構師頒佈了它,它只是不可協商的(例如,依賴於全局和參數名稱的大量客戶代碼),爲您的第一筆業務是確保您的簡歷是最新的,並將其打印在最佳打印機上,並開始與社交網絡成員取得聯繫,以便在運行更加明智的地點找工作;接下來,以避免失去醫療保險,直到一個更好的工作中發現,嘗試

def myfunc(somevar = None): 
    if somevar is None: 
     print globals().get('somevar') 
    else: 
     print somevar 

我也改名爲您到myfunc,因爲這是它被名字叫用(儘管給出的非常糟糕的設計假想的最高法院建築師似乎能犯下,也許他指定的功能,通過它與定義的一個不同的名稱叫什麼?好像去的系統名稱衝突假設這個假設的,但已經相當可惡的傢伙有強迫你! - )。

+0

你真的很有趣,樂於助人!我改正了這個例子中的錯別字。現在我將更新問題並解釋爲什麼我對使用相同名稱感興趣。 – bogdan 2010-08-11 09:38:32

+0

@bogdan,感謝您的榮譽和澄清。在Python中,當一個值必須有一個通用的默認值,但可以用特定的值覆蓋每個調用時,前者通常用'default_'前綴命名 - 例如,請參閱socket模塊getdefaulttimeout和' setdefaulttimeout'函數和'timeout'命名參數給各種函數(在這種情況下使用getter和setter函數,而不是「只是一個全局變量」)也很常見,因爲_modules_不能使用內置的'property',這是什麼讓你總是避免在_classes_中的getters/setter)。 – 2010-08-11 14:56:55

0

兩個解決方案:

  1. 重命名變量,即somevar_
  2. 將全局移到不同的模塊。你可以寫一個模塊myappdefaults

    import myappdefaults 
    print myappdefaults.somevar 
    
1

爲什麼你的局部變量必須具有相同的名稱作爲全局變量?重命名其中一個看起來像是一個簡單的解決方案。另一個選擇是將全局變量作爲參數傳遞,但這仍然會給你一個不同的變量名稱來訪問保存值。

0

這是做事情的正確方法。

somevar = "a" 

def mufunc(_somevar = None): 
    global somevar 
    if _somevar: 
     print _somevar 
    else: 
     print somevar 

if __name__ == '__main__': 
    global somevar 
    somevar = "b" 
    myfunc("c") 
    myfunc() $ should print "c" 
相關問題