在python函数调用中混淆了**参数

时间:2013-08-07 14:35:15

标签: python syntax

作为参考,我指的是post

中的答案

答案的作者提供了以下代码

def sum(*values, **options):
    s = 0
    for i in values:
        s = s + i
    if "neg" in options:
        if neg:
            s = -s
    return s

s = sum(1, 2, 3, 4, 5)            # returns 15
s = sum(1, 2, 3, 4, 5, neg=True)  # returns -15
s = sum(1, 2, 3, 4, 5, neg=False) # returns 15

然而,当我在我的地方跑步时,我收到以下错误

NameError: global name 'neg' is not defined

任何人都可以解释这个。一般而言,该功能如何知道values何时结束以及options何时开始

2 个答案:

答案 0 :(得分:4)

if neg:

那条线路有问题。它应该是:

if options["neg"]:

  

当值结束时和选项何时开始时,函数如何知道?

未命名的值会转到*values。关键字参数放在**options

答案 1 :(得分:2)

你犯了一个小错误。将您的代码更改为以下内容,它应该可以工作。只需从"neg"字典中获取options的值,(values包含未命名的参数,options包含关键字参数)

>>> def sum(*values, **options):
        s = 0
        for i in values:
            s = s + i
        if "neg" in options:
            if options["neg"]:
                s = -s
        return s

>>> s = sum(1, 2, 3, 4, 5, neg=True)
>>> s
-15
>>> sum(1, 2, 3, 4, 5)
15
>>> sum(1, 2, 3, 4, 5, neg=True)
-15
>>> sum(1, 2, 3, 4, 5, neg=False)
15

虽然正如@glglgl指出的那样,将代码更改为以下代码会将if语句合并为一个。

>>> def sum(*values, **options):
    s = 0
    for i in values:
        s = s + i
    if options.get("neg", False):
            s = -s
    return s

get(...)如何运作?

如果options词典没有键"neg",(由第一个if条件处理),则get(...)会返回默认值False并且s未被否定,如果options包含"neg",则会返回其值,在这种情况下,s将被取消,具体取决于字典中的值。