如何在python中检查函数参数值?

时间:2014-01-05 18:27:51

标签: python

Python初学者。对不起超级基本问题。

我想检查所有参数值,这样如果它是一个空字符串,我可以将值转换为None。

我想出了如何获取参数列表,但我无法弄清楚如何获取参数的值。

我现在拥有的是:

def __init__(self, first, middle, last):
    # convert blank attributes to None
    import inspect
    args = inspect.getargspec(self.__init__)[0]
    for arg in args:
        print 'arg: ' + str(arg)
        if arg == '':
            arg = None

这会获取参数名称,但不会获取其值。我怎样才能掌握价值观?

谢谢!

2 个答案:

答案 0 :(得分:3)

只有3个参数,不要打扰检查,只需直接引用它们,或使用全能参数*args

def __init__(self, *args):
    args = [argument or None for argument in args]

您可以通过locals() dictionary访问函数本地,但它只是只读的,您通常使用它来设置默认值。

如果您确实需要通用方法,我会使用装饰器:

from functools import wraps

def reset_to_none(func):
    @wraps(func)
    def wrapper(*args, **kw):
        args = [arg if not isinstance(arg, str) or arg else None for arg in args]
        kw = {k: arg if not isinstance(arg, str) or arg else None for k, arg in kw.items()}
        return func(*args, **kw)
    return wrapper

然后将其应用于您的__init__方法:

class SomeClass(object):
    @reset_to_none
    def __init__(self, first, middle, last):
        # any of `first`, `middle` or `last` being empty strings will be set to `None`

答案 1 :(得分:2)

您可以编写一个decorator,将所有空字符串参数转换为None

from functools import wraps

def emptyToNoneParameters (f):
    @wraps(f)
    def inner (*args, **kwargs):
        newArgs = [None if a == '' else a for a in args]
        newKwargs = {k: None if v == '' else v for k, v in kwargs.items()}
        return f(*newArgs, **kwargs)
    return inner

class MyType:
    @emptyToNoneParameters
    def __init__ (self, first, middle, last):
        print(first, middle, last)

x = MyType('a', '', '')
# prints: 'a', None, None