我正在尝试定义一个类似的函数:
def get_event_stats(elengths, einds, *args, **kwargs):
master_list = []
if avg:
for arg in args:
do stuff...
if tot:
for arg in args:
do stuff...
return master_list
我希望elengths和einds是固定的位置args(这些只是整数的数组)。我试图通过传递一个可变长度的数组列表作为* args和一些** kwargs来使用该函数,在这个例子中是两个(avg和tot),但可能更多,例如,
avg_event_time = get_event_stats(event_lengths, eventInds, *alist, avg=True, tot=False)
,其中
alist = [time, counts]
我的kwargs是avg和tot,它们的值分别为True和False。无论我如何尝试实现此功能,我都会遇到某种错误。在正确使用* args和** kwargs时我在这里错过了什么?
答案 0 :(得分:1)
如果您的意思是avg
和tot
应该作为关键字参数传递,例如在您的示例中get_event_stats(..., avg=True, tot=False)
,那么它们将填充在kwargs
中。您可以使用键查找在kwargs
dict中查找它们(例如kwargs['avg']
。
但是,如果它们根本不存在,则会产生关键错误,因此请使用dict.get()
方法:kwargs.get('avg')
如果不存在则返回None
,这是布尔False
。如果您明确需要kwargs.get('avg', False)
,如果它不存在,请使用False
。
def get_event_stats(elengths, einds, *args, **kwargs):
master_list = []
if kwargs.get('avg'):
for arg in args:
do stuff...
if kwargs.get('tot'):
for arg in args:
do stuff...
return master_list
答案 1 :(得分:0)
**kwargs
创建一个dict
,它不会将任意名称注入您的本地名称空间。如果您想查找特定关键字是否已通过,则无法测试if avg:
(没有名为avg
的变量),您需要检查avg
是否在{ {1}},例如dict
,或检查存在性和“真实性”,因此传递if 'avg' in kwargs:
等同于完全不传递它,测试avg=False
(使用if kwargs.get('avg'):
确保不会抛出任何异常如果kwargs.get('avg')
完全没有传递,那么avg
除外。
注意:如果可能的话,你应该真正转向Python 3。它使得编写此函数变得更加明显和干净,因为您可以完全避免使用if kwargs['avg']:
,并且通过将函数定义为:
kwargs
注意如果你在位置变量之后明确地命名关键字参数,你已经编写的函数的主体如何在没有修改的情况下工作,使你的代码更加自我记录(以及更高效,并且具有更好的自我检查;如果你将def get_event_stats(elengths, einds, *args, avg=False, tot=False):
master_list = []
if avg:
for arg in args:
do stuff...
if tot:
for arg in args:
do stuff...
return master_list
传递给它,那么干净的Py3代码会报错,告知你无法识别的参数,而avrg=True
方法需要显式检查未知参数,这会减慢你的速度并使代码膨胀。 / p>
最接近Py3错误检查的最小开销和类似的正确性/可读性将是:
**kwargs