有没有办法知道参数的值是否是默认值与用户指定的值?

Gar*_*ler 4 python arguments

我正在寻找像Lisp的arg-supplied-p变量一样的东西,以帮助区分默认值和用户指定的相同值.

例:

def foo(a=10):
    pass
Run Code Online (Sandbox Code Playgroud)

我想在foo中知道它是否像这样调用:

foo()
Run Code Online (Sandbox Code Playgroud)

或者像这样:

foo(10)
Run Code Online (Sandbox Code Playgroud)

或者甚至喜欢这样:

foo(a=10)
Run Code Online (Sandbox Code Playgroud)

最后2个对我来说是同义词; 我不需要知道那个细节.我已经仔细查看了检查模块,但getargspec为所有3个调用返回的结果完全相同.

Sve*_*ach 11

除了检查源代码,有没有办法告诉三个函数调用分开-它们意味着有完全相同的含义.如果您需要区分它们,请使用不同的默认值,例如None.

def foo(a=None):
    if a is None:
        a = 10
        # no value for a provided
Run Code Online (Sandbox Code Playgroud)

  • 这也解决了默认值是可变对象时遇到的问题.绝对是Pythonic的方式. (2认同)

Ned*_*der 6

正如Sven所指出的,通常使用None作为默认参数.如果您甚至需要区分无参数和明确的None之间的区别,则可以使用sentinel对象:

sentinel = object()

def foo(a=sentinel):
    if a is sentinel:
        # No argument was provided
        ...
Run Code Online (Sandbox Code Playgroud)