¿Por qué usar argparse en lugar de optparse?

Noté que la documentación de Python 2.7 incluye otro módulo de análisis de línea de comandos. Además de getopt y optparse ahora tenemos argparse .

¿Por qué se ha creado otro módulo de análisis de línea de comandos? ¿Por qué debería usarlo en lugar de optparse ? ¿Hay nuevas características que debería conocer?

A partir de Python 2.7 , optparse está en desuso y, con suerte, desaparecerá en el futuro.

argparse es mejor por todas las razones enumeradas en su página original ( https://code.google.com/archive/p/argparse/ ):

  • manejando argumentos posicionales
  • sub-comandos de apoyo
  • permitiendo prefijos de opciones alternativas como + y /
  • manejo de cero o más y uno o más argumentos de estilo
  • Produciendo más mensajes informativos de uso.
  • Proporcionando una interfaz mucho más simple para tipos personalizados y acciones

Más información también se encuentra en PEP 389 , que es el vehículo por el cual argparse convirtió en la biblioteca estándar.

¿Por qué debería usarlo en lugar de optparse? ¿Son sus nuevas características que debería conocer?

La respuesta de @Nicholas cubre esto bien, creo, pero no la pregunta más “meta” con la que comienza:

¿Por qué se ha creado otro módulo de análisis de línea de comandos?

Ese es el dilema número uno cuando se agrega cualquier módulo útil a la biblioteca estándar: ¿qué hace cuando surge una forma sustancialmente mejor, pero incompatible con los anteriores, de proporcionar el mismo tipo de funcionalidad?

O te mantienes en la forma antigua y ciertamente superada (normalmente cuando hablamos de paquetes complicados: asyncore vs twisted, tkinter vs wx o Qt, …) o terminas con varias formas incompatibles de hacer lo mismo (XML) los analizadores, IMHO, son incluso un mejor ejemplo de esto que los analizadores de línea de comandos, pero el paquete de email frente a las innumerables formas antiguas de tratar problemas similares tampoco está muy lejos ;-).

Puedes hacer quejas amenazantes en los documentos sobre las antiguas formas de ser “desaprobadas”, pero (siempre que necesites mantener la compatibilidad con versiones anteriores) no puedes eliminarlas sin impedir que las aplicaciones importantes e importantes pasen a las nuevas versiones de Python.

(El dilema número dos, que no está directamente relacionado con su pregunta, se resume en el viejo refrán “la biblioteca estándar es donde los buenos paquetes van a morir” … con lanzamientos cada año y medio más o menos, paquetes que no son muy, muy estable, no necesita lanzamientos más a menudo que eso, en realidad puede sufrir sustancialmente por estar “congelado” en la biblioteca estándar … pero, eso es realmente un problema diferente).

La mejor fuente para la justificación de una adición de Python sería su PEP: PEP 389: argparse – Nuevo módulo de análisis de línea de comando , en particular, la sección titulada ¿Por qué no son suficientes optoptas y optoptas?

¡También hay nuevos niños en el bloque!

  • Además de los ya citados optparse en desuso. [NO UTILICE]
  • También se mencionó argparse , que es una solución para las personas que no están dispuestas a incluir bibliotecas externas.
  • docopt es una biblioteca externa que vale la pena ver, que utiliza una cadena de documentación como el analizador para su entrada.
  • click es también lib externo y utiliza decoradores para definir argumentos. (Mi fuente recomienda: por qué hacer clic )
  • python-inquirer Para herramientas centradas en la selección y basadas en Inquirer.js ( repo )

Si necesita una comparación más profunda, lea esto y puede terminar usando docopt o haga clic . Gracias a Kyle Purdon!

Al principio estaba tan renuente como @fmark para cambiar de optparse a argparse, porque:

  1. Pensé que la diferencia no era tan grande.
  2. Bastante algunos VPS todavía proporciona Python 2.6 de forma predeterminada.

Entonces vi este documento, argparse supera a optparse, especialmente cuando se habla de generar un mensaje de ayuda significativo: http://argparse.googlecode.com/svn/trunk/doc/argparse-vs-optparse.html

Y luego vi ” argparse vs. optparse ” de @Nicholas, diciendo que podemos tener argparse disponible en python <2.7 (Sí, no lo sabía antes).

Ahora mis dos preocupaciones están bien abordadas. Escribí esto con la esperanza de que ayude a otros con una mentalidad similar.