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)
这没有多大意义 - 逗号是在将列表表示为字符串时放入的格式化内容,逗号不包含列表本身的值.
您想将列表的输出更改为字符串,还是在此处执行其他操作?如果你想要一个额外的"空"项,那么你可以附加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)
这两种变体都没有抱怨.