【问题标题】:How to pass a parameter as a default?如何将参数作为默认值传递?
【发布时间】:2017-11-08 02:02:20
【问题描述】:

我想使用参数的默认值,但在调用中包含它的名称。我认为将参数设置为 None 可以做到这一点,但事实并非如此。

例如:

def a(num=3):
    print(num)

a(num=None) #returns "None", not "3" like I want it to.

如何在调用中使用命名参数的默认值? (有可能吗?)

只是为了解释为什么我想做这样的事情(因为这可能是我整体编码风格的问题):

我经常有这样的代码

def add(num, numToAdd=1):
    return num+numToAdd

def addTwice(num, numToAdd=None):
    for i in range(2):
        num=add(num, numToAdd=numToAdd)
    return num

addTwice(3) #throws an error instead of returning 5

我想要的是addTwicenumToAdd 始终使用addnumToAdd 的默认值,无论它是什么。

原因:可能在后面的代码中我意识到执行add时默认添加2比添加1更好。

所以我改成

def add(num, numToAdd=2):
        return num+numToAdd

但是,除非我总是可以在 addTwice 中指定在收到默认值时使用默认值,否则这将无济于事。

所以,这就是理由。

换句话说:我有一个函数(第一个函数)调用另一个函数(第二个函数),如果第一个函数必须使用默认值,我希望它默认为默认值第二个功能。这样,我只需更改第二个函数的默认值(不是每个调用它的函数)即可更改默认功能。

【问题讨论】:

  • 如果包含默认参数,则不需要在函数调用中提及。只需a()
  • 它打印 None 因为您明确传递了覆盖默认值的参数
  • 为什么要传递一个值而不使用它?
  • 我不明白为什么这会受到如此严重的反对。这是一个合理的、写得很好的问题。
  • @michaelpri 请参阅我对我为什么要这样做的解释......你是对的,但我不想为每个显式案例编写默认参数的不同组合。

标签: python function named-parameters


【解决方案1】:

不,你不能:这在术语上是矛盾的。 当且仅当在参数列表中提供值时使用默认值。如果你提供了一个值,那么默认的不能在例程中使用。

【讨论】:

    【解决方案2】:
    def a(num=None):
        if num is None: 
           num = 3
        print(num)
    
    a(num=None)  # prints 3
    a() # prints 3
    

    ...我猜...也许

    或者解释默认参数

    def a(num=3):
       print(num)
    
    a(num=None) # prints None
    a() # prints 3
    

    【讨论】:

    • 是的,这就是我定义我的大部分函数的方式......不过这很麻烦,尤其是在有很多参数的情况下。
    【解决方案3】:

    没有内置支持显式使用参数的默认值。如果您不想在调用站点保留参数,则必须非常手动地检索默认值:

    import inspect
    
    a(num=inspect.signature(a).parameters['num'].default)
    

    在大多数情况下这是不值得的。

    【讨论】:

      【解决方案4】:

      有一个great answer 说明如何执行此操作(如果您认为我要求的默认获取功能确实是您想要的)。但是,我只想指出,在实践中,我相信我试图实现的目标通常是使用全局变量来完成的。

      也就是说,做我想做的事情的通常方法是:

      DEFAULT_NUM_TO_ADD = 1
      def add(num, numToAdd=DEFAULT_NUM_TO_ADD):
          return num+numToAdd
      
      def addTwice(num, numToAdd=DEFAULT_NUM_TO_ADD):
          for i in range(2):
              num=add(num, numToAdd=numToAdd)
          return num
      
      addTwice(3) # returns 5
      

      这使我可以快速更改默认值,并且两个函数使用相同的默认值。它是明确且非常清楚的;这是pythonic。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-04
        • 1970-01-01
        • 1970-01-01
        • 2011-05-06
        • 2012-05-22
        • 1970-01-01
        • 1970-01-01
        • 2022-11-12
        相关资源
        最近更新 更多