¿Por qué no hay un método list.clear () en python?

Inspirado por esta pregunta.

¿Por qué no hay un método list.clear () en python? He encontrado varias preguntas aquí que dicen que la forma correcta de hacerlo es una de las siguientes, pero nadie ha dicho por qué no hay un método para hacerlo.

del lst[:] lst[:] = [] 

Si bien puede ir en contra del “zen de python” tener más de una forma de hacer algo, ciertamente me parece más obvio tener un método “list.clear ()”. También estaría en línea con los dictados y los conjuntos, los cuales tienen .clear ().

Encontré algunas publicaciones sobre python-dev y python-ideas sobre esto y no llegué a una respuesta definitiva (ver aquí (2006) y aquí (2009)). ¿Guido ha intervenido en ello? ¿Es solo un punto de discusión que aún no se ha resuelto en los últimos 4-5 años?

Actualización: list.clear () se agregó a Python en 3.3 – vea aquí

En los hilos que vinculó a Raymond Hettinger se resumen los pros y los contras de agregar ese método. Cuando se trata del diseño del lenguaje, es muy importante ser conservador. Vea, por ejemplo, el principio de “cada característica comienza con -100 puntos” que tiene el equipo de C #. No se obtiene algo tan limpio como Python al agregar funciones de forma voluntaria. Eche un vistazo a algunos de los lenguajes de scripting más populares para ver a dónde lo lleva.

Supongo que el método .clear() nunca cruzó la regla implícita de -100 puntos para convertirse en algo que valga la pena agregar al lenguaje central. Aunque dado que el nombre del método ya se usa para un propósito equivalente y la alternativa puede ser difícil de encontrar, probablemente no esté tan lejos de eso.

Si bien no hubo list.clear() cuando se hizo esta pregunta, 3.3 ahora tiene uno (como se solicita en http://bugs.python.org/issue10516 ). Además, se han agregado métodos clear() a bytearray y MutableSequence para facilitar el cambio entre listas y otras colecciones (set, dict, etc.).

Los detalles completos del cambio se pueden encontrar aquí .

No puedo responder al porqué; pero debería haber uno, por lo que se pueden borrar diferentes tipos de objetos con la misma interfaz.

Un ejemplo obvio, simple:

 def process_and_clear_requests(reqs): for r in reqs: do_req(r) reqs.clear() 

Esto solo requiere que el objeto admita la iteración y que sea compatible con clear (). Si las listas tuvieran un método clear (), esto podría aceptar una lista o establecer por igual. En cambio, dado que los conjuntos y listas tienen una API diferente para eliminar sus contenidos, eso no funciona; terminas con un truco innecesariamente feo, como:

 def process_and_clear_requests(reqs): for r in reqs: do_req(r) if getattr(reqs, "clear"): reqs.clear() else: del reqs[:] 

En lo que a mí respecta, el uso de del obj [:] u obj [:] = [] son ​​solo trucos desagradables e intuitivos para evitar el hecho de que a la lista le falta (()).

Esto es llevar a “reducir la redundancia” a una falla, donde daña la consistencia del lenguaje, lo que es aún más importante.

En cuanto a lo que deberías usar, te recomendaría del obj [:]. Creo que es más fácil de implementar para objetos que no son de tipo lista.

Durante las pruebas, a menudo es útil configurar los datos que forman el dominio de las pruebas en variables globales, de modo que las pruebas se puedan construir unas sobre otras si es necesario / más simple. En tales casos, tener un método para borrar la lista le permitiría hacerlo sin la necesidad de declarar esas variables como globales dentro de una función (es decir, las pruebas). Lo sé, las pruebas no deberían depender unas de otras …

La pregunta debe ser por qué se consideró necesario, en primer lugar, clear . Lo siguiente funciona para borrar cualquier colección de Python que se me ocurra.

 def clear(x): return type(x)() >>> s = {1, 2, 3} >>> s set([1, 2, 3]) >>> s = clear(s) >>> s set([]) >>> l = [1, 2, 3] >>> l [1, 2, 3] >>> l = clear(l) >>> l []