usage mutually float exclusive argumentparser argument arg_parser add_argument python command-line optparse getopt argparse

python - mutually - ¿Por qué usar argparse en lugar de optparse?



mutually exclusive args argparse (5)

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?


¿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 versiones 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 lidiar con problemas similares tampoco está demasiado lejos ;-).

Puede hacer quejas amenazadoras en los documentos acerca de que las formas antiguas están "en desuso", pero (siempre que necesite mantener la compatibilidad con versiones anteriores) no puede eliminarlas sin impedir que las aplicaciones importantes e importantes se muevan 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).


¡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 this y puede terminar usando docopt o haga clic . Gracias a Kyle Purdon!


A partir de Python 2.7 , optparse está en desuso y es de esperar que desaparezca 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.


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 por defecto.

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 dirigidas. Escribí esto con la esperanza de que ayude a otros con una mentalidad similar.