使用** kwargs将传递给函数的参数映射到本地名称空间?

时间:2018-11-29 19:20:37

标签: python function namespaces arguments kwargs

如果这是一个重复的问题,我事先表示歉意。.我想更好地了解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() }

2 个答案:

答案 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)))