¿Cómo hacer una lista en Python que termine con una coma final?

Cuando uso Mechanize para cambiar el estado de un elemento en un formulario, necesito hacer una lista en Python como esta:

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

La lista debe terminar con la coma final, de lo contrario no funcionará. Por ejemplo, el siguiente código funciona:

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

Sin embargo, el siguiente código no funciona:

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

este es el mensaje de error que recibo cuando no uso la coma final:

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

Bueno, después de lidiar con este problema durante toda una tarde, aprendí que así es como podía hacer lo que necesitaba SIN la coma final:

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

preguntado el 03 de mayo de 12 a las 19:05

¿Puedes explicar lo que quieres decir? ¿Quiere decir que le gustaría imprimir una lista con una coma al final o quiere decir que le gustaría asignar una variable de una lista con una coma al final? -

¿Qué tratas de hacer exactamente? No hay razón para terminar una lista con una coma... -

Al buscar TypeError: ListControl, debe establecer una secuencia que mostrará que esta pregunta se ha realizado varias veces; sin embargo, no hay otra solución que escribir la lista yo mismo. -

¿Hay alguna forma de ejecutar un depurador en esta aplicación? Específicamente, me gustaría saber cuál es el valor del valor en la línea 1984 (uno antes de la excepción). "si el valor es Ninguno o es similar a una cadena (valor)" ¿Cuál está disparando esta llamada? es como una cuerda o ninguno? -

@relima Verifique mi respuesta: actualicé usando dis para desensamblar el código de bytes de Python para construir las listas con y sin la coma adicional, y son exactamente iguales; por lo tanto, no puede ser el factor que importa aquí. -

1 Respuestas

Esto no tiene mucho sentido: la coma es una cosa de formato que se coloca cuando se representa la lista como una cadena, la coma no tiene valor para la lista en sí.

¿Desea cambiar la salida de la lista como una cadena o hacer algo más aquí? Si desea tener un elemento 'vacío' adicional, puede agregar None a la lista, por ejemplo, para emular eso.

Para hacer una cadena formateada con una coma adicional como esa, querrá hacer algo como esto:

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

Actualización para su edición:

Las dos líneas que ha enumerado significan exactamente lo mismo en Python: no hay forma de que una funcione y la otra no. La coma final es azúcar sintáctica que le permite ser perezoso al escribir literales de lista.

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

Editar de nuevo:

Es una imposibilidad real que la coma final afecte su código. Si desensamblamos el código de bytes que Python produce:

import dis

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

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

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

Lo que nos da:

  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    

Podemos ver que el código de bytes es exactamente el mismo. La coma adicional no se almacena como información con la lista. Dado esto, podemos decir que esto no es lo que está afectando su código, por lo que podría simplificar su ejemplo a algo que podamos probar, con un error reproducible, podemos ver cuál es realmente el problema.

No puedo reproducir este comportamiento:

prueba.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> 

Y entonces:

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

Ambas variantes funcionan sin quejas.

contestado el 03 de mayo de 12 a las 22:05

... lo siento, ¿qué? ¿Qué en mi respuesta resolvió tu problema? Quiero decir, me alegro de que lo haya hecho, pero tenía la intención de mostrarle que su pregunta tenía una premisa defectuosa. - gareth latty

En realidad, tienes razón, no solucionó el problema. Estoy cambiando la pregunta para mostrar el mensaje de error. - relima

Gracias por esforzarse mucho en reproducir mi error, sin embargo, actualicé la pregunta para reflejar lo que hice para solucionar el problema. No sé si esto puede estar detrás del error, pero en mi formulario uso input type="hidden" . Aún así, br.set_value hace lo que necesito sin necesidad de usar la coma final. - relima

@relima probé con una entrada de tipo hidden y obtuve un error a menos que asigné una cadena: no se permitieron listas en absoluto. - gareth latty

intente usar br.form.set_all_readonly (Falso) antes de hacer el cambio. - relima

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.