2012-05-03 85 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