繁体   English   中英

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

[英]mapping arguments passed to function to local namespace using **kwargs?

如果这是一个重复的问题,我事先表示歉意。我想更好地了解python中的** kwargs东西,实际上是希望能够编写一个能够处理拆包并内部引用key:value对的key:value 。传递** kwargs参数。

我的小例子如下:

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}')

通过test(**arguments)调用上面的方法当然会失败,但是有没有办法将** kwargs解压到函数中的本地名称空间中以完成我的想法呢?

我考虑过的一件事是在函数内创建一个字典,然后使用exec()将key:value对编译到此命名空间字典中,但这似乎有点麻烦。

还有另一种方法可以将** kwargs中的局部变量直接分配给函数?

提前致谢。

编辑

我还探索了使用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

我注意到print(**kwargs)试图访问“ kwargs”作为命名变量。 我想我要解决的问题是,如果使用默认参数定义函数,然后传递** kwargs可以解决问题? 我可以尝试一下,看看它是否有效并更新。

编辑二

看起来有效,好像将函数定义为具有默认值使我可以直接从** kwargs引用那些变量,而无需这样做,这需要引用** kwargs字典并始终知道键。

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() }

运行以下命令可以访问变量,但是我怀疑这不是安全代码或“好代码”。

locals().update(test(**arguments))

kwargs是一个字典,因此您可以简单地通过其键引用其中的值:

def test(**kwargs):
    if kwargs:
        print(f'apple: {kwargs.get("apple")}')
        print(f'zoom:  {kwargs.get("zoom")}')
        print(f'bar: {kwargs.get("bar")}')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM