无法在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)
答案 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', ''))