2024-05-20 04:38:30 发布
网友
我正在寻找类似Lisp的arg-supplied-p变量的东西,以帮助区分默认值和用户指定的相同值。在
示例:
def foo(a=10): pass
我想知道在foo里是不是这样叫的:
或者像这样:
foo(10)
foo(a=10)
最后两个对我来说已经足够同义了;我不需要知道那个细节。我已经看过inspect模块一点,但是getargspec对所有3个调用都返回完全相同的结果。在
除了检查源代码外,无法区分这三个函数调用–它们的意义完全相同。如果需要区分它们,请使用不同的默认值,例如None。在
None
def foo(a=None): if a is None: a = 10 # no value for a provided
不是真的。您可以使用foo.func_defaults来获取函数的默认参数列表,这样就可以使用它来检查传递参数的对象标识。但这只对可变对象有效。正如在您的例子中一样,无法判断某人是传递了10还是使用了默认的10,因为这两个10很可能是同一个对象。在
foo.func_defaults
不管怎样,这只是一个粗略的近似值,因为它不会告诉你函数是如何被调用的:它告诉你默认参数是什么,然后你查看实际参数,并试图猜测它们是否相同。无法访问用于调用函数的语法形式。在
这里有一个例子说明了它有时是如何工作的,有时是不起作用的
>>> 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 ...
除了检查源代码外,无法区分这三个函数调用–它们的意义完全相同。如果需要区分它们,请使用不同的默认值,例如
None
。在不是真的。您可以使用
foo.func_defaults
来获取函数的默认参数列表,这样就可以使用它来检查传递参数的对象标识。但这只对可变对象有效。正如在您的例子中一样,无法判断某人是传递了10还是使用了默认的10,因为这两个10很可能是同一个对象。在不管怎样,这只是一个粗略的近似值,因为它不会告诉你函数是如何被调用的:它告诉你默认参数是什么,然后你查看实际参数,并试图猜测它们是否相同。无法访问用于调用函数的语法形式。在
这里有一个例子说明了它有时是如何工作的,有时是不起作用的
正如Sven所指出的,通常将None用作默认参数。如果您甚至需要区分no参数和显式None之间的区别,可以使用sentinel对象:
相关问题 更多 >
编程相关推荐