0

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

['2009', '2008', '2007', '2006', '2005', '2004',]

该列表必须以尾随逗号结尾,否则它将不起作用。例如,以下代码有效:

br = mechanize.Browser()
br.select_form(nr=0)
br['ctl03'] = ['2009', '2008', '2007',]

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

br = mechanize.Browser()
br.select_form(nr=0)
br['ctl03'] = ['2009', '2008', '2007']

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

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

好吧,在整个下午处理了这个问题之后,我了解到这是我可以让它做我需要的事情而没有尾随逗号:

 mylist = ['2009', '2008', '2007']
 br.set_value(mylist, name="ctl03")
4

1 回答 1

9

这没有多大意义 - 逗号是在将列表表示为字符串时放入的格式化内容,逗号对列表本身没有任何价值。

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

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

"["+", ".join(mylist)+",]"

更新您的编辑:

您列出的两行在 Python 中的含义完全相同 - 不可能有一条有效而另一条无效。结尾的逗号是语法糖,它让你懒得写出列表文字。

>>> ['2009', '2008', '2007',] == ['2009', '2008', '2007']
True

再次编辑:

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

import dis

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

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

dis.dis(test1)
dis.dis(test2)

这给了我们:

  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    

我们可以看到字节码是完全一样的。额外的逗号不会作为信息与列表一起存储。鉴于此,我们可以说这不是影响您的代码的原因,所以您能否将您的示例简化为我们可以测试的东西,并带有可重现的错误,我们可以看到问题实际上是什么。

我无法重现这种行为:

测试.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> 

进而:

>>> 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"]

两种变体都可以毫无怨言地工作。

于 2012-05-03T18:07:37.133 回答