Estoy creando una utilidad de línea de comandos que requiere seis datos de información para funcionar correctamente. Se parece a esto:
fm-git filename repository path comment username password
Sin embargo, en cualquier sistema individual, username
será password
constante.
Al ejecutar la utilidad, me resulta difícil compilarla. Por ejemplo, aquí hay una llamada de prueba a la utilidad (dividida en varias líneas para facilitar la lectura):
/Users/chuck/Projects/fm-git/fm-git.py chiv-lib
/Users/chuck/Projects/chiv-lib/ Chivalry/ "continued testing"
Administrator abc1234
Estoy considerando diferentes formas de transmitir estos argumentos. Por ejemplo, fm-git -f filename -r repository ...
o fm-git --filename filename --repository repository...
. También estoy considerando realizar los ajustes de configuración de los argumentos username
y password
, ya que generalmente no cambiarán y luego podrían eliminarse de la llamada de la utilidad.
Cuando los argumentos de utilidad son muchos pero necesarios, ¿cuál es la práctica aceptada para mantener la legibilidad de las llamadas de utilidad?
Respuesta1
Normalmente, las aplicaciones Unix permiten múltiples formas de proporcionar esta información, y las formas más "específicas" anulan las menos específicas.
Así que tienes:
Para aplicaciones gráficas, el conjunto de herramientas utilizado casi siempre proporciona alguna forma de tener recursos (por ejemplo,
xrdb
-estilo en X simple, etc.)un archivo de configuración, si el kit de herramientas aún no proporciona uno.
Opciones de línea de comando, tanto en formato corto como largo (fácil con
getopt
C)valores predeterminados razonables si no se proporciona información, por ejemplo, el directorio actual para una ruta
Los parámetros posicionales solo tienen sentido para unos pocos obligatorios, seguidos posiblemente de una lista de archivos (porque las especificaciones comodín se expanden a múltiples parámetros). Seis piezas individuales son demasiadas; el orden es difícil de recordar, así que utilice opciones para estos.
Para las contraseñas, puede resultar útil proporcionar una manera de hacer que la aplicación lea la contraseña desde la entrada estándar, posiblemente mediante el uso de un valor especial (por ejemplo, --password -
o -p -
).
Quien utilice la aplicación puede elegir si las contraseñas codificadas, las contraseñas en los archivos de configuración o permitir que el usuario ingrese la contraseña es la mejor opción para el caso de uso particular.
Respuesta2
En general es una buena idea:
- calcule los argumentos dependientes pero permita redefinirlos: por ejemplo, en su ejemplo tiene
filename
lo mismo que$(basename repository)
, por lo que es posible que solo necesite el repositorio, pero tiene la opción--filename
de proporcionar un nombre de archivo alternativo. - ocultar la autenticación de la línea de comando y
ps
la salida. Colóquelos en algún archivo: puede ser$HOME/.fm-git.conf
, dé al archivo más restricciones comochmod 600 $HOME/.fm-git.conf
y léalos desde el archivo. A veces también es una opción obtener el nombre de usuario y la contraseña de las variables de entorno (como el nombre de usuario predeterminado es el nombre de usuario de su sistema oSUDO_USER
), pero puede que no sea su caso.
Entonces, después de esas dos optimizaciones, solo tienes 3 parámetros cli, creo que es aceptable. Siéntase libre de usarlos como parámetro posicional o proporcionar algunas banderas como --comment
: proporcionar banderas largas mejorará la legibilidad si usa su programa en scripts más, pero será necesario escribir más si ejecutará su programa principalmente manualmente desde cli.
De todos modos, mientras escribes tu programa en Python, te recomiendo que usesmódulo de análisis de argumentos-- le ayudará a analizar los parámetros y realizar cambios en el futuro si desea cambiarlos.