功能不承认args和kwargs

时间:2017-09-07 01:10:43

标签: python python-2.7 args kwargs

我正在尝试定义一个类似的函数:

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时我在这里错过了什么?

2 个答案:

答案 0 :(得分:1)

如果您的意思是avgtot应该作为关键字参数传递,例如在您的示例中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
相关问题