繁体   English   中英

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

[英]Passing arguments to a function with named 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 我怎样才能做到这一点?

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

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

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

现在您可以通过执行以下操作来解压 dict:

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)

不同之处在于这将根据它们的位置而不是它们的名称来解压参数。

Python 允许将迭代器解到位置参数和映射到关键字参数。 语法分别是*arguments**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))

    显式迭代/映射对于脚本接口更简单,即当您在slave(func, args, kwargs)使用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)

暂无
暂无

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

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