2012-05-03 61 views
0

当使用机械化改变表单中的项的状态,我需要做一个列表在Python像这样的:如何在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 

好,处理后W第i个这个问题对整个下午,我才知道,这是我怎么能拿它做什么,我需要没有后面的逗号:

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

你能解释一下你的意思吗?你的意思是你想打印一个带尾随逗号的列表,或者你的意思是你想从一个带有尾随逗号的列表中指定一个变量? – Crisfole

+0

你想要做什么?没有理由用逗号来结束列表... – oobivat

+0

正在搜索TypeError:ListControl,必须设置一个序列将显示此问题已被询问了多少次;但除了自己输入列表以外,没有其他解决方案。 – relima

回答

9

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

是否要将列表的输出更改为字符串,或者在此处执行其他操作?如果你想有一个额外的'空'项目,那么你可以附加None到列表,例如,以模拟。

为了与这样的一个额外的逗号格式化字符串,你会想要做这样的事情:

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

更新您的编辑:

这两条线已上市的意思准确同样的事情在Python中 - 没有办法,一个工作,其他没有。尾随的逗号是句法糖,可以让你懒散地写出列表文字。再次

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

编辑:

这是一个实际的不可能是后面的逗号会影响你的代码。如果我们反字节码蟒蛇生产:

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

这两个变种的工作毫无怨言。

+2

...对不起,什么?我的答案是什么解决了你的问题?我的意思是,我很高兴它做到了,但它的目的是向你展示你的问题有一个有缺陷的前提。 –

+0

其实,你是对的,它力求解决这个问题。我正在更改问题以显示错误消息。 – relima

+0

谢谢你真的很难重现我的错误,但我更新了这个问题,以反映我做了什么来解决这个问题。我不知道这是否可能出现在错误后面,但是在我的表单中,我使用了input type =“hidden”。不过,br.set_value可以完成我所需要的功能,而无需使用拖曳逗号。 – relima