2010-07-10 13 views
237

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é usar argparse en lugar de optparse?

¿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 deba conocer?

+7

O tal vez no use ninguno porque desde 2012 Python tiene un módulo fácil, potente y realmente * genial * para el análisis de argumentos llamado docopt. http://docopt.org – ndemou

+1

intente haga clic en es envoltorio alrededor optparse. –

Respuesta

257

A partir del pitón 2.7, optparse es obsoleto, y se espera que desaparecerá en el futuro.

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

  • manejo de argumentos posicionales
  • apoyo sub-comandos
  • permiten prefijos de opciones alternativas como + y /
  • manejo de cero o más y uno o más argumentos de estilo
  • produciendo mo re mensajes informativos de uso
  • que proporcionan una interfaz mucho más simple para este tipo de acciones y

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

+14

Una interfaz mucho más simple para tipos personalizados ... pero una interfaz más compleja en general. Realmente me pregunto por qué incluso cambié a optparse, porque * drumroll * getopt se quedará *. Sí, no hay desprecio por ese dinosaurio. Sheeesh. –

+3

La mención de "pureza" de 'optparse' en el PEP y luego los argumentos acerca de cuán complejo es agregarlo hace que suene como si estuviera codificado para ser tan flexible como la roca (mal). –

+1

La interfaz de los subcomandos es pobre. La salida predeterminada no es útil y cambiarla es difícil. –

58

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

@ respuesta de Nicolás cubre esta bien, creo, pero no el más "meta" cuestión de empezar con:

Por qué tiene otra línea de comandos análisis sintáctico ha creado módulo?

Ese es el número uno dilema cuando se añade cualquier módulo útil para la biblioteca estándar: ¿qué hacer cuando una, forma sustancialmente mejor, pero al revés-compatible para proporcionar el mismo tipo de funcionalidad emerge?

O te quedas con la forma antigua y reconocidamente superada (normalmente cuando hablamos de paquetes complicados: asyncore vs twisted, tkinter vs wx o Qt, ...) o terminas con múltiples formas incompatibles de hacer las Lo mismo (los analizadores XML, en mi humilde opinión, son un mejor ejemplo de esto que los analizadores de línea de comandos), pero el paquete email frente a la miríada de formas antiguas de tratar problemas similares tampoco está muy lejos ;-).

Puede hacer gruñidos amenazadores en los documentos acerca de las formas antiguas de ser "obsoleta", pero (siempre que necesite mantener la compatibilidad hacia atrás) realmente no se los puede quitar sin detener las aplicaciones grandes e importantes al pasar a nuevos lanzamientos de Python.

(El dilema número dos, no 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 versiones cada año y medio, paquetes que no están 't muy, muy estable, no necesidad de liberaciones más a menudo que eso, en realidad puede sufrir sustancialmente al ser "congelado" en la biblioteca estándar ... pero, eso es realmente un problema diferente).

+0

Es cierto que puede incluir argparse.py para las instalaciones de python antes de la versión 2.7 y no preocuparse por el retroceso. - cambios incompatibles. Algo más para rastrear, pero aún se mantiene fuera de la biblioteca estándar en argparse.googlecode.com –

+2

Argparse es sustancialmente mejor solo para algunos usos (¿de nicho?). No es realmente mejor en términos absolutos, es * diferente *. Puede hacer cosas que optparse no puede, pero también tiene regresiones. Un ejemplo con el que me topé: optparse manejado "-" por defecto (no estoy seguro de que hiciera lo que se supone que debe hacer) mientras que argparse no sabe nada de él. –

3

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

  1. pensé que la diferencia no era tan grande.
  2. Bastante algunos VPS aún proporcionan Python 2.6 por defecto.

Y vi este documento, argparse supera optparse, sobre todo cuando se habla de la generación significativa mensaje de ayuda: http://argparse.googlecode.com/svn/trunk/doc/argparse-vs-optparse.html

Y entonces vi "argparse vs. optparse" por @Nicholas, diciendo que podemos tener argparse disponible en pitón < 2.7 (Sí, no sabía eso antes)

Ahora mis dos preocupaciones están bien atendidas. Escribí esto esperando que ayude a otros con una mentalidad similar.

1

yo personalmente prefiero optparse en lugar de argparse porque

  1. argparse es que tiene algunos comportamientos problemáticos que hacen que el manejo de las interfaces de línea de comandos arbitrarios.

  2. argparse tiene un comportamiento mágico incorporado para adivinar si algo es un argumento o una opción. Esto se convierte en un problema cuando se trata de líneas de comando incompletas, ya que no es posible saber sin tener una comprensión completa de la línea de comando de cómo se comportará el analizador.

  3. argparse actualmente no admite la inhabilitación de argumentos intercalados.

Ambos funcionan bien para aplicaciones básicas de línea de comandos.

+1

"argparse es que tiene algunos comportamientos problemáticos que hacen que se manejen interfaces de línea de comando arbitrarias". - No puedo entender lo que intentas decir aquí. Parece que a la oración le falta un principio y un final. – Toastgeraet

+2

porque es una copia y pega fallido de [comparación de Click] (http://click.pocoo.org/5/why/#why-not-argparse). – leesei

11

¡También hay nuevos niños en la cuadra!

  • Además del ya mencionado obsoleto optparse. [NO USAR]
  • argparse también se mencionó, que es una solución para las personas que no desean incluir libretas externas.
  • docopt es una lib que vale la pena mirar, que utiliza una cadena de documentación como analizador para su entrada.
  • haga clic en también es lib externo y utiliza decoradores para definir argumentos.(Mi fuente recomienda: Why Click)

Si necesita una mayor profundidad en comparación lea this y que puede terminar usando docopt o clic. Gracias a Kyle Purdon!

+0

si bien este es un comentario que vale la pena, todavía es un comentario más que una respuesta ... no hay votos a favor, no hay votos a favor ¡yo tampoco! ¡Expande tu respuesta con un valioso resumen del artículo para convertirlo en una respuesta real !: https://meta.stackexchange.com/a/8259/172394 – Stefano

+0

Traté de incluir un resumen de mi enlace. Espero que valga la pena. una buena respuesta de stackoverflow – lony

Cuestiones relacionadas