将参数传递给具有命名参数的函数

时间:2019-08-13 11:07:33

标签: python-3.x arguments

如何将命名参数传递给另一个函数。

在过去的8个小时中,我查看了包装器,argparse和Google。我想念一些大事。

def my_func(a='something', b='something_else'):
    add a and b
    return something
def slave(func, args):
    result = func(args)
    return result

slave_work = {my_func, (a=50, b=90)}

print (slave(slave_work)

>>> 140

2 个答案:

答案 0 :(得分:3)

您现在要做的只是将一个集合作为单个参数传递给slave。因此,您可能缺少位置参数的TypeError

您可能希望将slave_work更改为dict(现在它是一个集合),然后看起来像:

slave_work = {'func': my_func, 'args': {'a': 50, 'b': 90}}

现在您可以执行以下操作来解开字典的内容:

print(slave(**slave_work))

这大致相当于:

print(slave(func=slave_work['func'], args=slave_work['args'])

然后在slave函数内部将其更改为:

result = func(**args)

另一个选择是使用列表(在这种情况下为元组)解包。因此,您的slave_work也可以是:

slave_work = {'func': my_func, 'args': (50, 90)}

然后您对slave的呼叫将是相同的,但内部 slave更改为:

result = func(*args)

区别在于,这将根据参数的位置而不是其名称来解压缩参数。

答案 1 :(得分:2)

Python允许un/pack迭代到位置参数,并映射到关键字参数。语法分别为*arguments and **keywords

>>> def my_func(a, b):
...     return a - b
...
>>> args = [2, 1]   # iterable for positional arguments
>>> my_func(*args)  # unpack iterable
1
>>> kwargs = {'b': 1, 'a': 2}  # mapping for keyword arguments
>>> my_func(**kwargs)          # unpack mapping
1

您甚至可以结合使用两种形式的可变参数-例如my_func(*args, **kwargs)


要创建一个调用另一个包装函数,可以使用以下任一方法:

  • 明确传递可迭代/映射:

    # take regular arguments...
    def slave(func, args, kwargs):
        # ...and unpack them
        result = func(*args, **kwargs)
        return result
    
    # explicit iterable [1] and mapping {'b': 2}
    print(slave(my_func, [1], {'b': 2}))
    # from existing args/kwargs
    args, kwargs = [1], {'b': 2}
    print(slave(my_func, args, kwargs))
    

    对于脚本接口,即当您在args中使用kwargs / slave(func, args, kwargs)时,显式可迭代/映射更简单。它们对于手动使用相当麻烦,即当您致电slave(func, [1], {'b': 2})时。

  • 转换传入的参数:

    # take variadic arguments...
    def slave(func, *args, **kwargs):
        # ...and pass them on
        result = func(*args, **kwargs)
        return result
    
    # explicit iterable [1] and mapping {'b': 2}
    print(slave(my_func, 1, b=2))
    # from existing args/kwargs
    args, kwargs = [1], {'b': 2}
    print(slave(my_func, *args, **kwargs))
    

    隐式可迭代/映射对于手动使用(即,当您调用slave(func, 1, b=2)时)更为简单。它们对于脚本化接口来说是昂贵的,也就是说,当您拥有args / kwargs时,必须将它们解压缩到slave(func, *args, **kwargs)中。