【问题标题】:How to force the default parameter in python如何在python中强制使用默认参数
【发布时间】:2018-02-02 23:38:08
【问题描述】:

TLDR:我想将参数传递给函数,强制函数使用它的默认值,就好像我没有提供任何参数一样。

例如

def foo(string = "DEFAULT PARAM"):
    print(string)

def bar(string = None):
    foo(string)

bar()            # Should print "DEFAULT PARAM", but instead prints None
bar("Hello!")    # Should print "Hello!"

我知道有很多解决方法,例如:

def bar(string = None):
    foo() if string is None else foo(string)

但我希望有更优雅的东西。像某种默认关键字一样,我可以将 bar 的默认字符串设置为。是这样的吗?

【问题讨论】:

  • def bar(string = "DEFAULT PARAM"): 有什么问题?
  • why def bar(string = None) is not considered elegant ? 因为 foo 打印无。 What's wrong with def bar(string = "DEFAULT PARAM"): 因为将来会有不同的 bar 调用的函数,有自己的默认值。
  • 其中两个已经很好了。不需要替代品。
  • foo(string) if string else foo() 可能是您要做的最好的事情。你可以把它炸成一个if 块和一个else 块,但是真的没什么意义
  • 我同意@Patrick Haugh

标签: python


【解决方案1】:

不,您可以传递的任何值都不会触发默认值来代替传递的值。传递一个值会将该值绑定到形参句点。

【讨论】:

    【解决方案2】:

    我在 Python 中多次遇到这种烦恼(主要是在使用 argparse 时,它使用空值填充省略的选项,而不是仅仅从命名空间中省略它们)。

    如果您想将None 作为值显式传递,并像完全省略它一样对待它,这是最好的:

    def foo(string=None):
        if string is None:
            string = "DEFAULT PARAM"
        print(string)
    
    def bar(string=None):
        foo(string)
    

    相反的烦恼是当None 是一个有效值时,您实际上有时需要显式传递它。在这种情况下,这是最好的:

    sentinel = object()
    
    def foo(arg=sentinel):
        if arg is sentinel:
            arg = "DEFAULT PARAM"
        print(arg)
    
    def bar(arg=None):
        foo(arg)
    

    【讨论】:

      【解决方案3】:

      你不能。我相信已经讨论过在None 是可以通过的可接受值的情况下添加新的单例。据我所知,这些建议总是被否决,因为 python 已经有很多单例:

      NotImplemented
      Ellipsis
      None
      

      您提出的解决方案是可变默认参数的典型解决方案,因此将其用于其他情况(如本例)也是有意义的。显然,有时None 是一个合理的传递值——在这种情况下,选择另一个单例或创建自己的(通过object())。


      您的最终解决方案(即当您无法控制该函数并且您只是无法在不传递参数的情况下调用该函数)是parse the default value from the function itself 并传递它。 p>

      显然,这种方法应该谨慎使用:-)

      【讨论】:

        【解决方案4】:
        def foo(string = 'default'):
            print(string)
        
        def bar(**kwargs):
            foo(**kwargs)
        
        bar() # prints 'default'
        bar(string = 'baz') # prints 'baz'
        

        【讨论】:

        • -1 这是bar 函数的重大更改。以前你可以用位置参数来调用它,现在你不能。这也是一种糟糕的风格 - 出于微不足道的原因使用 **kwargs 是使您的库代码不可读并将其变成维护噩梦的好方法。 避免!
        • 犯错是学习过程中不可或缺的一部分。如果人们想碰热炉,就让他们去做,不要传福音。
        猜你喜欢
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 2013-02-20
        • 2012-08-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-08
        • 2016-11-12
        相关资源
        最近更新 更多