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

有没有办法告诉python函数收到默认值或关键字参数?,python,function,parameter-passing,keyword,Python,Function,Parameter Passing,Keyword,有没有办法判断何时调用func,b值100取自默认参数或关键字参数?没有,不是您编写的代码。但是,您可以执行以下操作: def func(a, b = 100): return a + b func(a) func(a,b = 100) 您可以使用对象作为默认值,例如 def func(a, b=None): if b is None: b = 100 return a + b 知道真的不是func的事。但您可以将默认值改为None dummy = ob

有没有办法判断何时调用func,b值100取自默认参数或关键字参数?

没有,不是您编写的代码。但是,您可以执行以下操作:

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

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

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

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

知道真的不是func的事。但您可以将默认值改为
None

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

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

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

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

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

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

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)
由于
kwargs
是一个包含所有非可选参数的字典,因此您可以检查此字典以确定哪些参数已传递/未传递


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

如果没有通过,你怎么知道?通过
None
与不通过任何东西是一样的。不,你不能区分这两种情况是描述发生了什么的正确方式。我是说,如果你需要区分这一点,你的解决方案就不起作用了。调用
func(a_var)
相当于调用
func(a_var,None)
。如果你真的需要知道,那么你需要将默认值设置为不可能传入的值,通过以调用方无权访问默认值的方式打包函数。好的,使用不可变对象。这没关系,因为它是一个你不会做任何事情的虚拟物体。哦,我知道你在那里做了什么。您正在测试
id
是否匹配。我给你留下的链接更多的是关于传递空列表,以便稍后在函数中使用。对于我在某处读到的A来说,许多答案看起来非常熟悉…这可能是一个。聪明的,但如果我在真实代码中看到这一点,它肯定会让我挠头。@AdamParkin是的,在90%或更多的情况下,
解决方案将是正确的“更好“,只是因为它更容易理解。如果我在审查我在现实世界中发布的代码,我会要求使用
None
的方法,或者说明为什么需要这种特定方法。但它仍然是解决所有问题的方法,尽管如此,如果OP需要解决所有问题的方法,它可能是解决方案。
b was not passed in
150
b was passed in
150