通过Python中的kwargs设置全局函数的局部变量

时间:2013-03-18 10:21:35

标签: python

无法在Python中重载函数让我调查*args**kwargs以将未定义数量的参数和变量定义传递给被调用函数。我试图将这个概念应用于一个简单的函数,该函数使用一个分隔符将参数打印到屏幕上(并且没有令人讨厌的“围绕着所有的东西”)。您可以在该帖子的末尾找到代码段。

我的问题是我不知道将kwargs值实际分配给各自参数OUTSIDE CLASSES的正确方法。如果我想使用setattr接受3个参数(setatt(self, key, value)),当我尝试仅传递一个键和一个值时,它总是会给我一个错误。是否有正确的方法为类外的全局函数的参数赋值?

我希望你能为我清除天空。

这是我想通过找到setattr(self, key, value)的替代方案来开展工作的无效代码示例:

import sys

def printAll(*args, **kwargs):
    sep = ""
    for key, value in kwargs.items():
        setattr(key, value)
    for arg in args:
        sys.stdout.write(str(arg))
        sys.stdout.write(sep)

nr = 9876543210
printAll("How many", "arguments", " I want", nr, sep='-')

编辑: 好的,这是阅读@Martijn Pieters和@Fabian答案后的更新和工作示例函数:

def printAll(*args, **kwargs):
    # use sep = 'value' to define a seperator or use the default one
    sep = kwargs.get('sep')
    if sep is None:
        sep = ""
    for arg in args:
        sys.stdout.write(str(arg))
        sys.stdout.write(sep)

2 个答案:

答案 0 :(得分:2)

Python 2:

def foo(*args, **kwargs):
    for key, value in kwargs.iteritems():
        locals()[key] = value
    return foobar
    exec ''

print foo(foobar=12)

但这不是一个好主意。正如Martijn所说,你应该专门访问kwargs。通常,您不能修改函数中的locals(),除非您在其中添加exec语句。这迫使解释器再次访问locals(),因为命名空间可能已经改变(在这种情况下也是如此)。将exec语句放在return之后就足够了,所以只要它在那里就永远不会被执行。

请不要这样做。

答案 1 :(得分:1)

您通常kwargs值设置为局部变量。这是一本字典,只需参考包含的值:

sys.stdout.write(kwargs.get('sep', ''))