如何将args传递给函数

时间:2019-11-02 02:12:39

标签: python introspection

python中是否有一种方法可以获取调用方传递给函数的参数?这是我想要做的:

# function
def repeat(self, min=None, max=None, optional=False):
    do_something()

我需要根据是否将一个或多个参数传递给它来做一些不同的事情。例如:

r.repeat('hello').repeat(2,None)

需要区分:

r.repeat('hello').repeat(2) # only one arg passed

我认为locals可能是一个不错的起点,但是它从函数中获取了默认的arg,因此对我的目的不起作用:

{'_max': None, '_min': 2, 'discrete': [], 'optional': False, 'max': None, 'min': 2, 'self': r'(hello)'}

换句话说,max不应显示为args之一。这可以在python中做吗?我也尝试过使用inspect,但这似乎也显示了默认值:

(Pdb) inspect.getargvalues(f)
ArgInfo(args=['self', 'min', 'max', 'optional', 'discrete'], varargs=None, keywords=None, locals={'pdb': <module 'pdb' from '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/pdb.py'>,
 '_max': None, '_min': 2, 'discrete': [], 'optional': False, 'max': None, 'min': 2, 'self': r'(hello)', 'f': <frame object at 0x101e2de68>})

1 个答案:

答案 0 :(得分:1)

我认为您的问题有更简单的解决方案。我知道的最简单的方法是拥有一个默认值,该默认值不可能作为实际参数传入。创建一个虚拟对象,并将其用作默认对象:

dummy_default = object()

def my_function(x=dummy_default):
    actual_x = None if x is dummy_default else x
    # ...

这样,如果没有传递任何参数,或者显式传递了actual_x,则None将是None,但是您可以通过测试x is dummy_default来区分这两种情况。


您也可以使用*vargs

def my_function(*vargs):
    if len(vargs) > 1:
        raise TypeError('Too many arguments')
    x = vargs[0] if len(vargs) >= 1 else None
    # ...

表达式len(vargs) == 0将告诉您是否没有传递参数。

这种方式会更糟,因为使关键字参数工作也更加复杂,如果使用IDE,则不会得到有用的参数提示,并且需要对错误数量的参数进行自己的错误处理