列表函数参数不等于其默认值

时间:2014-10-13 10:19:52

标签: python python-2.7

给定表单的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的签名被修改时我都必须更新它。

1 个答案:

答案 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

我想这可以作为装饰工作得更好。

唯一的缺点是你无法知道用户是打算使用默认值,还是在函数调用中明确地输入了这个值。

相关问题