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>})
答案 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,则不会得到有用的参数提示,并且需要对错误数量的参数进行自己的错误处理