【问题标题】:Wrap python function, but let outer function have keyword arg包装python函数,但让外部函数有关键字arg
【发布时间】:2013-12-23 15:54:52
【问题描述】:

我希望能够包装一个函数,同时在外部函数中仍然允许可选(关键字)参数。我可以这样做:

def outer(p1, p2, *a, **k):
     inner(*a, **k)

但是如果我想让 p2 成为“可选参数”呢?很明显:

def outer(p1, p2=None, *a, **k):
     inner(*a, **k)

不起作用,我知道为什么它不起作用。我想知道是否有一种很好、干净的方法来实现这一点。是否有一些众所周知的模式或约定?

【问题讨论】:

  • 使用函数装饰器
  • 你说的它不起作用到底是什么意思?
  • 通过可选你的意思是你想使用p2作为一个关键字参数吗?如果是这种情况,请尝试:Python 2.x - default arguments with *args and **kwargs
  • 只是想知道为什么你不能把所有的论点都设为 *a 或 **k

标签: python arguments word-wrap keyword-argument


【解决方案1】:

使用functools 模块:

outer2 = functools.partial(outer, p2=None)

【讨论】:

    【解决方案2】:

    如果你只是想确保 p2 在参数从外部传递到内部时存在:

     def outer(p1, *a, **k):
         if 'p2' not in k: k.update(p2 = None)
         inner(*a, **k)
    

    对于更通用的方式,您可以保留默认值并在需要时应用它们:

    def outer (p1, *args, **kwargs):
        defaults = {'a': 1, 'b':2}
        for k, v in defaults.items():
            if k not in kwargs: kwargs[k] = v
        inner(*a, **k)
    

    如果是这种情况,您可能希望将帖子的标题编辑为类似于“如何在 **kwargs 参数中包含默认值”的内容,因为换行并不是语法的一部分

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-09
      • 1970-01-01
      • 2020-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多