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

2024-05-20 04:38:30 发布

您现在位置:Python中文网/ 问答频道 /正文

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

示例:

def foo(a=10):
    pass

我想知道在foo里是不是这样叫的:

^{pr2}$

或者像这样:

foo(10)

或者像这样:

foo(a=10)

最后两个对我来说已经足够同义了;我不需要知道那个细节。我已经看过inspect模块一点,但是getargspec对所有3个调用都返回完全相同的结果。在


Tags: 模块用户示例foodefargpass细节
3条回答

除了检查源代码外,无法区分这三个函数调用–它们的意义完全相同。如果需要区分它们,请使用不同的默认值,例如None。在

def foo(a=None):
    if a is None:
        a = 10
        # no value for a provided

不是真的。您可以使用foo.func_defaults来获取函数的默认参数列表,这样就可以使用它来检查传递参数的对象标识。但这只对可变对象有效。正如在您的例子中一样,无法判断某人是传递了10还是使用了默认的10,因为这两个10很可能是同一个对象。在

不管怎样,这只是一个粗略的近似值,因为它不会告诉你函数是如何被调用的:它告诉你默认参数是什么,然后你查看实际参数,并试图猜测它们是否相同。无法访问用于调用函数的语法形式。在

这里有一个例子说明了它有时是如何工作的,有时是不起作用的

>>> def f(x="this is crazy"):
...     print x is f.func_defaults[0]
>>> f()
True
>>> f("this is crazy")
False
>>> def f(x=10):
...     print x is f.func_defaults[0]
>>> f()
True
>>> f(10)
True

正如Sven所指出的,通常将None用作默认参数。如果您甚至需要区分no参数和显式None之间的区别,可以使用sentinel对象:

sentinel = object()

def foo(a=sentinel):
    if a is sentinel:
        # No argument was provided
        ...

相关问题 更多 >