2

无法在 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)
4

2 回答 2

2

蟒蛇2:

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

print foo(foobar=12)

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

请不要这样做。

于 2013-03-18T10:33:11.470 回答
1

您通常不会kwargs值设置为局部变量。它是一个字典,只需引用包含的值:

sys.stdout.write(kwargs.get('sep', ''))
于 2013-03-18T10:25:13.953 回答