Python - 关键字参数后跟位置参数

8

我有一个函数,可以接受不定长度的参数,如下所述。我将kwargs作为字典传递。然而,我不明白为什么会出现错误。

class PanSearch(object):    
    otp_wait = 30

    def __init__(self, surname, dob, mobile_no, otp_host, **kwargs):
        kwargs.setdefault('browser', 'chromium')
        self.surname = surname
        self.dob = dob
        self.mobile_no = mobile_no
        self.otp_host = otp_host
        self.middle_name = kwargs.get('middle_name', None)
        self.first_name = kwargs.get('first_name', None)
        self.status = kwargs.get('status')
        self.gender = 'M' if kwargs.get('status') == 'P' else None

# instantiating the object
otp_host = 'abc.xyz.in'
input_kwargs = {'status': 'P', 'gender': 'M', 'browser': 'chromium'}
driver = PanSearch(surname='kulkarni', dob='13/10/1981', mobile_no='9769172006', otp_host, **input_kwargs)

File "pan_no.py", line 87
    driver = PanSearch(surname='kulkarni', dob='13/10/1981', mobile_no='9769172006', otp_host, **input_kwargs)
                                                                                        ^
SyntaxError: positional argument follows keyword argument

1
otp_host是一个变量,同时也是参数的名称吗?你是不是想说otp_host=otp_host - Ry-
1
将其更改为otp_host=otp_host,或者只需在关键字参数之前添加它。 - AChampion
1
你正在关键字参数后面传递位置参数 (otp_host)(例如 surname='kulkarni')。 - mgilson
更新后的 otp_host - Akhilesh Chobey
2个回答

14

你需要进行更改。

driver = PanSearch(surname='kulkarni', dob='13/10/1981', mobile_no='9769172006', otp_host, **input_kwargs)
to
driver = PanSearch('kulkarni', '13/10/1981', '9769172006', otp_host, **input_kwargs)

5
当我们使用 (*keyword) 时,它会收集剩余的位置关键字,例如:
>>>def print_1(x,y,*z):
       print(x,y,z)
>>>print_1(1,2,3,4,5,6)
(1,2,(3,4,5,6,7))

我们可以看到,th(*argument)会将提供的值放入元组中,并且不会收集关键字。如果您想要收集关键字参数,可以使用(**argument),例如

  >>>def print_paramas(x,y,z=3,*pospar,**paramas):
            print(x,y,z)
            print(pospar)
            print(paramas)
    >>>print_paramas(1,2,4,445,8889,36,foo=5,br=46,sily=78)
    1 2 4
    (445, 8889, 36)
    {'foo': 5, 'br': 46, 'sily': 78}

你可以得到你想要的,但是当你使用(**augument)时,最好注意你的导入方式,例如:

>>>print_paramas(x=1,y=2,z=4,445,8889,36,foo=5,br=46,sily=78)
SyntaxError: positional argument follows keyword argument

为什么会出现这种情况呢?因为(**argument)只收集关键字参数,而你定义的函数包含参数名(x,y,z),当你输入参数(x=,y=,z=)时,就会导致(**argument)和你的关键字参数发生冲突。所以,如果你想解决这个问题,我建议你改变这个单词。

>>>driver = PanSearch(surname='kulkarni', dob='13/10/1981', mobile_no='9769172006', otp_host, **input_kwargs)

按顺序执行

>>>driver = PanSearch('kulkarni', '13/10/1981','9769172006', otp_host, **input_kwargs)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接