【问题标题】:Setting the default value of a function input to equal another input in Python将函数输入的默认值设置为等于 Python 中的另一个输入
【发布时间】:2011-04-01 20:28:20
【问题描述】:

考虑以下函数,它在 Python 中不起作用,但我将用它来解释我需要做什么。

def exampleFunction(a, b, c = a):
    ...function body...

也就是说,我想为变量 c 分配与变量 a 相同的值,除非指定了替代值。上面的代码在 python 中不起作用。有没有办法做到这一点?

【问题讨论】:

    标签: python function default-value keyword-argument


    【解决方案1】:
    def example(a, b, c=None):
        if c is None:
            c = a
        ...
    

    关键字参数的默认值不能是变量(如果是,则在定义函数时将其转换为固定值。)通常用于将参数传递给主函数:

    def main(argv=None):
        if argv is None:
            argv = sys.argv
    

    如果None 可能是一个有效值,则解决方案是使用*args/**kwargs 魔法,如carl 的回答,或使用哨兵对象。执行此操作的库包括 attrsMarshmallow,在我看来它更干净而且可能更快。

    missing = object()
    
    def example(a, b, c=missing):
        if c is missing:
            c = a
        ...
    

    唯一c is missing 为真的方式是c完全你在那里创建的虚拟对象。

    【讨论】:

    • 没错。一旦定义了函数,默认参数就会一成不变。
    • @delnan 这就是为什么不能像def(x=2,y)那样在最后提供非默认设置参数的原因,而是我必须将函数定义为def(y, x=2)
    【解决方案2】:

    这种通用模式可能是最好的和最易读的:

    def exampleFunction(a, b, c = None):
        if c is None:
            c = a
        ...
    

    您必须注意None 不是c 的有效状态。

    如果您想支持“无”值,您可以执行以下操作:

    def example(a, b, *args, **kwargs):
        if 'c' in kwargs:
            c = kwargs['c']
        elif len(args) > 0:
            c = args[0]
        else:
            c = a
    

    【讨论】:

    • +1 提到 None 不能成为 c 的有效状态,以便 c=None 技巧起作用。
    【解决方案3】:

    一种方法类似于:

    def foo(a, b, c=None):
        c = a if c is None else c
        # do something
    

    【讨论】:

      猜你喜欢
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-31
      相关资源
      最近更新 更多