【问题标题】:Is there a way to tell a python function received a default value or keyword parameter?有没有办法告诉 python 函数接收到默认值或关键字参数?
【发布时间】:2012-03-17 12:30:59
【问题描述】:
def func(a, b = 100):
  return a + b

func(a)
func(a,b = 100)

有什么方法可以判断func什么时候被调用,b值100取自默认参数还是关键字参数?

【问题讨论】:

标签: python function parameter-passing keyword


【解决方案1】:

不,不是您编写的代码。但是,您可以这样做:

def func(a, b=None):
    if b is None:
        b = 100
    return a + b

【讨论】:

  • 如果没有通过,你怎么知道?
  • 通过None 与不通过任何东西是一样的。
  • 不,你无法区分这两种情况是描述所发生情况的正确方式。我是说,如果你需要区分这一点,你的解决方案就行不通。
  • 调用func(a_var)相当于调用func(a_var, None)
  • 如果您真的需要知道,那么您需要通过将函数打包为调用者无权访问默认值。
【解决方案2】:

匿名对象是覆盖所有可能情况的方法。

def foo(a, b=object()):
    if b is foo.func_defaults[0]:
         # no value was passed
    # do whatever

【讨论】:

  • 聪明,但如果我在真实代码中看到这一点,肯定会让我挠头。
  • @AdamParkin 是的,在 90% 的情况下(或更多),None 解决方案会“更好”,因为它更容易理解。如果我正在查看我在现实世界中发布的代码,我会要求采用None 的方法或说明为什么需要这种特定方法的理由。但它仍然是解决所有问题的锤子方法,如果 OP 需要解决所有问题的锤子,它可能是解决方案。
【解决方案3】:

知道这不是 func 的业务。但是你可以默认为None

def func(a, b=None):
  if b is None:
    # b = default b
    b = 100
  return a + b

【讨论】:

    【解决方案4】:

    你可以使用一个对象作为默认值,例如

    dummy = object()
    
    def func(a, b=dummy):
      used_default = b is dummy
      if used_default:
        b = 100
      print used_default
    
    func(0)           # prints True
    func(0, None)     # prints False
    func(0, object()) # prints False
    

    【讨论】:

    【解决方案5】:

    如果您的意图是检查 b 是否与 default 值完全匹配,那么不要使用默认值!如果您绝对必须将b 保留为可选,请传递一个特殊值(可能是-1)来表示不寻常的情况,并确保在您的__doc__ 中注明这一点。只需确保您无法在任何日常使用中达到异常值,并且为包含该逻辑而编写的异常不会修改代码的敏感区域。

    【讨论】:

      【解决方案6】:

      其他建议的替代方法是使用kwargs 参数,然后执行以下操作:

      def func(a, **kwargs):
      if 'b' in kwargs:
          print 'b was passed in'
          b = kwargs['b']
      else:
          print 'b was not passed in'
          b = 100
      
      return a + b
      
      
      a = 50
      func(a)
      func(a, b = 100)
      

      输出:

      b was not passed in
      150
      b was passed in
      150
      

      因为kwargs 是一个包含所有非可选参数的字典,您可以检查该字典以确定已传递/未传递的内容。

      如果需要,您可以更高效地查找b,而不是查找两次kwargs

      【讨论】:

        猜你喜欢
        • 2019-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多