2017-06-30 340 views
-5

在功能def test(**params),我怎麼使用的**params的鑰匙,通過創建與kwargs.keys()kwargs.values(),我可以在我的功能test內使用命名變量?蟒蛇:** kwargs變量

+3

爲什麼不直接使用'params ['keyname']'?爲什麼你需要單獨的局部變量?您不能動態地將新的本地名稱添加到函數體中。 –

+1

即使你這樣做了,假設他們調用'test(foo = 3)',並且你將一個'foo'局部變量初始化爲'3'。除非'test'主體已經使用'foo',你基本上不能對這個變量做任何事情,如果它*已經使用'foo',爲什麼不定義一個常規的'foo'參數而不是隻是'** params'? – user2357112

回答

-2

編輯:這種方法在大多數情況下不起作用。我在IPython中測試它在外部環境中的工作。

您應該只使用kwargs __get__查找。這是不好的做法,

~~但如果你堅持要創建這些變量,你可以這樣做:locals().update(kwargs)。這樣做使該代碼有效:~~

def foo(**kwargs): 
    locals().update(kwargs) 
    return a + 3 

print(foo(a=3)) 

~~將輸出6 ~~

將輸出NameError:名字 '一' 是沒有定義


編輯:這作品

我真的很驚訝,更新的本地人不能在標準的解釋器中工作。我也發現eval也不起作用。多年來,我一直在IPython中使用這樣的技巧。看看Modifying locals in Python看起來你曾經可以在Python 2中使用exec來完成這項工作,但它在Python 3中不再有效(這可能是件好事)。

但是,我發現我認爲可行的黑客攻擊。再次,請不要在實踐中這樣做。

def foo(**kwargs): 
    foo.__globals__.update(kwargs) 
    return a + 3 

print(foo(a=3)) 
+1

再一次,我必須指出[不,這實際上並不奏效](http://ideone.com/XT1WzC)。 – user2357112

+1

從[文檔](https://docs.python.org/3.6/library/functions.html#locals):「注意不應修改此字典的內容;更改可能不會影響本地和免費的值解釋器使用的變量「。 –

+0

是的,但現在污染了*全局範圍*。另外,在IPython中修改'locals'也不起作用,所以我不確定你看到了什麼行爲。 –