如何在Python中创建一个以逗号结尾的列表?

rel*_*ima 0 python list mechanize

当使用mechanize来改变表单中项目的状态时,我需要在Python中创建一个列表,如下所示:

['2009', '2008', '2007', '2006', '2005', '2004',]
Run Code Online (Sandbox Code Playgroud)

列表必须以尾随逗号结尾,否则它将无效.例如,以下代码有效:

br = mechanize.Browser()
br.select_form(nr=0)
br['ctl03'] = ['2009', '2008', '2007',]
Run Code Online (Sandbox Code Playgroud)

但是,以下代码不起作用:

br = mechanize.Browser()
br.select_form(nr=0)
br['ctl03'] = ['2009', '2008', '2007']
Run Code Online (Sandbox Code Playgroud)

这是我不使用尾随逗号时得到的错误消息:

Traceback (most recent call last):
  File "C:/Users/Renato/PycharmProjects/Agrolink/faostat.py", line 43, in <module>
    br['ctl03$DesktopThreePanes1$ThreePanes$ctl01$TMyears'] = ['2009', '2008', '2007']
  File "C:\Python26\lib\site-packages\mechanize\_form.py", line 2782, in __setitem__
    control.value = value
  File "C:\Python26\lib\site-packages\mechanize\_form.py", line 1977, in __setattr__
    self._set_value(value)
  File "C:\Python26\lib\site-packages\mechanize\_form.py", line 1985, in _set_value
    raise TypeError("ListControl, must set a sequence")
TypeError: ListControl, must set a sequence
Process finished with exit code 1
Run Code Online (Sandbox Code Playgroud)

好吧,在整个下午处理这个问题之后,我了解到这就是我如何能够做到我需要做的事情而不用尾随的逗号:

 mylist = ['2009', '2008', '2007']
 br.set_value(mylist, name="ctl03")
Run Code Online (Sandbox Code Playgroud)

Gar*_*tty 9

这没有多大意义 - 逗号是在将列表表示为字符串时放入的格式化内容,逗号不包含列表本身的值.

您想将列表的输出更改为字符串,还是在此处执行其他操作?如果你想要一个额外的"空"项,那么你可以附加None到列表,例如,模仿它.

要使用这样的额外逗号格式化字符串,您需要执行以下操作:

"["+", ".join(mylist)+",]"
Run Code Online (Sandbox Code Playgroud)

更新您的编辑:

你列出的两行在Python中意味着完全相同的东西 - 没有办法可以运行,而另一条运行则没有.尾随逗号是语法糖,允许你懒惰写出列表文字.

>>> ['2009', '2008', '2007',] == ['2009', '2008', '2007']
True
Run Code Online (Sandbox Code Playgroud)

再次编辑:

尾随逗号影响您的代码实际上是不可能的.如果我们反汇编字节码python产生:

import dis

def test1():
    ['2009', '2008', '2007',]

def test2():
    ['2009', '2008', '2007']

dis.dis(test1)
dis.dis(test2)
Run Code Online (Sandbox Code Playgroud)

这给了我们:

  4           0 LOAD_CONST               1 ('2009') 
              3 LOAD_CONST               2 ('2008') 
              6 LOAD_CONST               3 ('2007') 
              9 BUILD_LIST               3 
             12 POP_TOP              
             13 LOAD_CONST               0 (None) 
             16 RETURN_VALUE         
  7           0 LOAD_CONST               1 ('2009') 
              3 LOAD_CONST               2 ('2008') 
              6 LOAD_CONST               3 ('2007') 
              9 BUILD_LIST               3 
             12 POP_TOP              
             13 LOAD_CONST               0 (None) 
             16 RETURN_VALUE    
Run Code Online (Sandbox Code Playgroud)

我们可以看到字节代码完全相同.额外的逗号不会作为列表信息存储.鉴于此,我们可以说这不会影响您的代码,因此您可以将示例简化为我们可以测试的内容,并且可重现的错误,我们可以看到问题实际上是什么.

我无法重现这种行为:

的test.html:

<form name="test">
<input type="checkbox" name="vehicle" value="Bike" /> I have a bike<br />
<input type="checkbox" name="vehicle" value="Car" /> I have a car
</form> 
Run Code Online (Sandbox Code Playgroud)

然后:

>>> br.open("file:///path/to/test.html")
<response_seek_wrapper at 0x1d74cf8 whose wrapped object = <closeable_response at 0x1f9be60 whose fp = <open file '/path/to/test.html', mode 'rb' at 0x221b9c0>>>
>>> br.select_form(name="test")
>>> br["vehicle"] = ["Bike", "Car",]
>>> br["vehicle"] = ["Bike", "Car"]
Run Code Online (Sandbox Code Playgroud)

这两种变体都没有抱怨.

  • 对不起,什么?我的回答是什么解决了你的问题?我的意思是,我很高兴它确实如此,但它的目的是向你展示你的问题有一个有缺陷的前提. (2认同)