有没有办法告诉python函数收到默认值或关键字参数?

时间:2012-02-28 01:31:13

标签: python function parameter-passing keyword

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

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

有没有办法告诉func何时被调用,b值100是从默认值还是关键字参数中获取的?

6 个答案:

答案 0 :(得分:4)

不,不是因为你已经编写了代码。但是,您可以这样做:

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

您可以使用对象作为默认值,例如

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

其他建议的替代方法是使用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两次。