试图理解Python中的可选,列表和命名参数

时间:2013-05-09 17:33:32

标签: python python-3.x syntax-error optional-parameters kwargs

我是Python的初学者,试图理解函数参数及其类型和顺序。

我尝试用不同种类的论证进行实验,这是我的实验

def main():
    test_a(2, 33, 44)
    test_b(2, 33)
    test_c(2)
    ## test_d(2,,44) **Produces Invalid syntax**

    test_e(2,33,44,55,66)
    test_f(2, 44,55,66, y = 44)

    test_g(2, 33, 44,55,66, rofa = 777, nard = 888)
    ##test_h(2, 33, foo = 777, boo = 888, 44,55,66)  **Invalid Syntax in Function definition
    ##test_l(2, 44,55,66 ,  foo= 777, boo = 888, y  = 900) **Invalid Syntax in Function definition
    test_m(2, 44,55,66 , y = 900, foo=77777 , boo = 88888)

#############################################################
## NO optional arguments
def test_a(x,y,z):
    print("test_a : x = {}, y = {}, z = {} ".format(x ,y ,z))

## One optional argument at the end
def test_b(x, y, z = 22):
    print("test_b : x = {}, y = {}, z = {} ".format(x ,y ,z))

## TWO optional arguments at the end
def test_c(x, y = 11, z = 22):
    print("test_c : x = {}, y = {}, z = {} ".format(x ,y ,z))

## ONE optional argument at the middle
## Produces Non-default argument follows default argument
#### **** DEFAULT ARGUMENTS MUST COME AT THE END **** ####
## def test_d(x, y = 11, z):
##    print("test_d : x = {}, y = {}, z = {} ".format(x ,y ,z))

#################################################################

## NO optional argument + One List argument
def test_e(x, y, *args):
    print("test_e : x = {}, y = {} ||".format(x, y), end= " ")
    for i in args :
        print(i)

## One optional argument + One list argument
def test_f(x, *args , y = 5):
    print("test_f : x = {}, y = {} ||".format(x, y), end= " ")
    for i in args :
        print(i)

################################################################

## No optional argument, one list, one keyword arguments
def test_g(x,y,*args, **kwargs):
    print(x, y)
    for i in args:
        print(i)

    for i, v in kwargs.items():
        print(i, v)

## **kwargs befor *args produces syntax error !!!
##def test_h(x,y, **kwargs, *args):
##    print(x, y)
##    for i in args:
##        print(i)
##
##    for i, v in kwargs.items():
##        print(i, v)

## **kwargs befor optional argument produces syntax error !!!
##def test_l(x,*args,**kwargs, y = 5):
##    print(x, y)
##    for i in args:
##        print(i)
##
##    for i, v in kwargs.items():
##        print(i, v)
##    

## One optiona, list and keyword arguments
def test_m(x,*args,y = 5, **kwargs):
    print(x, y)
    for i in args:
        print(i)

    for i, v in kwargs.items():
        print(i, v)


if __name__ == "__main__":
    main()

在这个实验之后,我真的了解了大部分事情。但是有一个问题我无法理解。

test_htest_m中的函数定义中,**kwargs在可选参数和列表参数之前定义,当我运行程序时,即使我没有使用该函数,刚刚定义它..它产生Syntax Error ..我很高兴知道为什么会这样?

感谢。

2 个答案:

答案 0 :(得分:3)

关键字参数必须是传递给函数的最终参数。 Read up on it here. **kwargs之类的参数必须是函数签名中的 last 参数(详见文档中的该页面)。来自文档:

  

当存在** name形式的 final 形式参数时,它会接收一个字典(请参阅映射类型 - dict),其中包含除了与形式参数相对应的所有关键字参数。

即使您不使用该函数,您的代码引发SyntaxError的原因是,如果您违反此规则,Python甚至无法完成函数定义,因为您尝试提供的签名是非法的。< / p>

答案 1 :(得分:1)

*args**kwargs必须是指定的最后一个参数(按此顺序!);原因是它们实际上是“catch-alls”,它们匹配传递给函数的参数,这些参数与预先列出的特定参数不匹配,因此在特定参数之前列出它们是不明确的。

例如,上面的test_m必须指定为

def test_m(x, y=5, *args, **kwargs):
    ...