给定表单的Python函数定义:
def foo(a=None, b=1, c='bar'):
如何动态确定哪些参数设置为不同于默认值的值?例如:
foo(48)
我希望能够动态识别a
是唯一设置的参数。即使我在签名中添加了其他参数(即我不想进行手动检查if a == None
等),我正在寻求的解决方案仍将继续工作。
== UPDATE ==
澄清我的目标:
对于函数foo的一些用户,我允许它被执行。如果我确定该用户属于用户类型/类/类别Bar,那么我只想让它成功 ,如果他们使用参数foo
的参数调用a
。如果他们为任何其他参数提供了参数(或者至少是不等于默认值的参数),那么应该引发异常。 (我知道哪个用户正在根据其他全局数据调用该函数)。
同样,我可以简单地说if b != 1 or c != 'bar'
,但每次foo
的签名被修改时我都必须更新它。
答案 0 :(得分:3)
我认为您最好的做法是使用inspect
。
import inspect
def foo(non_default_var, a=None, b=1, c='bar'):
inspector = inspect.getargspec(foo)
local_vars = inspector.args # = ['d', 'a', 'b', 'c']
default_values = inspector.defaults # = (None, 1, 'bar')
default_vars = local_vars[-len(default_values):] # Since default values are at the end
for var, default_value in zip(default_vars, list(default_values)): # Now iterate and compare
print locals()[var] == default_value # True if the variable is default
我想这可以作为装饰工作得更好。
唯一的缺点是你无法知道用户是打算使用默认值,还是在函数调用中明确地输入了这个值。