如果这是一个重复的问题,我事先表示歉意。.我想更好地了解python中的** kwargs东西,实际上是希望能够编写一个能够处理解包和内部引用{{ 1}}对中传递** kwargs参数。
我的小例子如下:
key:value
我希望能够引用传递到函数中的字典的键和值,而无需从函数本身内部显式引用它们。
arguments = {'apple': 50, 'zoom': 'foo', 'bar': True}
通过def test(**kwargs):
if kwargs is not None:
print(f'apple: {apple}')
print(f'zoom: {zoom}')
print(f'bar: {bar}')
调用上面的方法当然会失败,但是有没有办法将** kwargs解压到函数中的本地名称空间中以完成我的想法?
我考虑过的一件事是在函数内创建一个字典,然后使用test(**arguments)
将key:value对编译到此命名空间字典中,但这似乎有点麻烦。
还有另一种方法可以将** kwargs中的局部变量直接分配给函数?
先谢谢了。
编辑
我还使用exec()
进行了探索,并编写了以下内容:
vars()
具有以下输出:
def test(**kwargs):
try:
print(**vars())
except Exception as e:
print(e, '\n\n')
print(vars())
if kwargs is not None:
try:
print(f'apple: {apple}')
print(f'zoom: {zoom}')
print(f'bar: {bar}')
except:
for k, v in kwargs.items():
print(f'k: {k} : v: {v}')
我注意到'kwargs' is an invalid keyword argument for this function
{'kwargs': {'apple': 50, 'zoom': 'foo', 'bar': True}, 'e':TypeError("'kwargs' is an invalid keyword argument for this function",)}
k: apple : v: 50
k: zoom : v: foo
k: bar : v: True
试图访问“ kwargs”作为命名变量。我想我要解决的问题是,如果使用默认参数定义函数,然后传递** kwargs可以解决问题?我可以尝试一下,看看它是否有效并进行更新。
EDIT II
这可行。.看起来像将函数定义为具有默认值,使我可以直接从** kwargs引用那些变量,而无需这样做,这需要引用** kwargs字典并始终知道键。
print(**kwargs)
编辑III: 更新
以下内容与我最初尝试传达和实现的内容最接近。处理任意用户关键字参数和 将它们绑定到本地名称空间中的变量...
arguments = {'apple': 50, 'zoom': 'foo', 'bar': True, 'baz': 99}
def test(apple = None, zoom = 'fee', bar = False, **kwargs):
if kwargs is not None:
try:
print(f'apple: {apple}')
print(f'zoom: {zoom}')
print(f'bar: {bar}')
except Exception as e:
print(e, '\n\n\n')
for k, v in kwargs.items():
print(f'k: {k} : v: {v}')
test(**arguments)
运行以下命令可以访问变量,但我怀疑这不是安全或“好”代码。
def test(**kwargs):
ns = {}
args_string = ''
for k, v in kwargs.items():
print(f'k: {k}, v: {v}')
try:
args_string += str(k) + '=' + '{}'.format(int(v))+'\n'
except:
args_string += str(k) + '=' + '"{}"'.format(str(v))+'\n'
exec(args_string, ns)
return {k:v for k, v in ns.items() if k in kwargs.keys() }
答案 0 :(得分:1)
Key Exchange
是字典,因此您可以简单地通过其键引用其中的值:
kwargs
答案 1 :(得分:1)
您可以使用def test(**kwargs):
if kwargs:
print(f'apple: {kwargs.get("apple")}')
print(f'zoom: {kwargs.get("zoom")}')
print(f'bar: {kwargs.get("bar")}')
循环来完成此操作,因为** kwargs是键-值映射,因此应将其视为for
:
dict
这仍然会将其解压缩到函数中的def test(**kwargs):
if kwargs is not None:
for k,v in kwargs.items():
print("%s: %s"%(str(k), str(v)))