2012-10-20 82 views
1

這是可能的(儘管通常不是一個好主意)來創建存儲在globals()其成員定義一個類或其他詞典:python函數如何將所有變量放在全局名稱空間中?

oddclass = type("oddclass", (object,), globals()) 

有沒有辦法做一個功能相同的,所以所有的它的局部變量存儲在全局(或模塊)名稱空間中,而不是它自己的?

我一次可以得到相同的效果一個變量,通過聲明變量global

def myfunction(): 
    global x 
    x = 10 

什麼我要找的是實現所有的內部變量相同的效果一般方式myfunction(也適用於尚未在頂部聲明的人),理想情況下某種單線程可輕鬆添加,然後在不再需要時刪除。

PS。我問這個問題,因爲我很好奇python管理函數名稱空間的方式。我的動機是在某些情況下(如許多本地數據神祕失敗的函數),將它用作臨時調試幫助,但是不要介意:我可以像上面一樣使用global。這個問題是關於python函數內部的。

+0

爲什麼你希望你的函數在被調試時以完全不同的方式運行?你冒險從一個函數的'x'干擾另一個函數。 – r3m0t

+2

爲什麼不使用調試器作爲調試幫助? – Keith

+0

如果某個函數在管理複雜數據結構過程中引發異常,則與IDLE捆綁在一起的調試器無法完成檢查剩餘部分的任務。 (的確,一個體面的調試器會使這個不確定)。但是可以從解釋器提示中檢查全局變量。我只爲這個即將崩潰的功能(手動)執行此操作,所以沒有風險。 – alexis

回答

1

這工作

>>> def test(): 
    x = 10 
    y = 'Some string' 
    for k, v in locals().items(): 
     globals()[k] = v 


>>> test() 

>>> x 
10 
>>> y 
'Some string' 

請記住,這是非常不安全的技術,絕不應使用

+0

謝謝,但這只是簡單地將_copies_值賦給全局命名空間;如果值發生變化或者我定義了更多變量,則全局值將不會跟蹤它們。 – alexis

+0

@alexis這不太對。這將在全局名稱空間中的本地變量中指定名稱。如果你改變它們中的一個,即'z = []',那麼'globals ['z'] = z'然後'z.append(1)',它會被反映出來。只有當你將__replace__中的一個名稱指向一個新對象,即'x + = 1'或'y.replace('','_')'時,纔會反映出來。更簡單的版本是'globals()。update(locals())'。 – agf

+0

您希望從全局空間中看到函數的本地人。如何在不調用函數的情況下更改本地值? 此外,當你離開函數時局部變量被破壞;處理代碼的人應該知道這一點。您可以通過我所建議的技術來保存它們的值,但是變量本身並不存在 - 它們在堆棧上創建並在函數返回時清除。 – volcano

相關問題