蟒蛇:** kwargs变量

问题描述:

在功能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

编辑:这种方法在大多数情况下不起作用。我在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'也不起作用,所以我不确定你看到了什么行为。 –