【问题标题】:Python- positional argument follows keyword argumentPython-位置参数跟随关键字参数
【发布时间】:2017-07-06 05:47:26
【问题描述】:

我有一个接受可变长度参数的函数,如下所述。我将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

【问题讨论】:

  • otp_host 是变量还是参数的名称?你的意思是otp_host=otp_host
  • 把它改成otp_host=otp_host,或者把它加在关键字参数之前。
  • 您在关键字参数(例如surname='kulkarni)之后传递了一个位置参数(otp_host
  • 更新了 otp_host

标签: python


【解决方案1】:

你需要改变

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)

【讨论】:

    【解决方案2】:

    当我们使用 (*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))
    

    我们可以看到(*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) 和你的关键字argumet,所以如果你想解决你的问题,我建议你换个词

    >>>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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-22
      • 1970-01-01
      • 2019-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-04
      相关资源
      最近更新 更多