Guión de Python Fire vs guión bajo
El paquete de python Firees muy útil para ejecutar scripts de Python desde la línea de comandos. Una cosa común es tener argumentos compuestos de varias palabras, por ejemplo, el nombre del gato que se puede escribir en 3 formas comunes:
- nombre de gato
- nombre_de_gato
- nombre-del-gato
Si bien el primero es compatible con casi todo, el segundo debe evitarse en bash ( ¿Deberían las opciones de línea de comando en los sistemas operativos de estilo POSIX tener un estilo de subrayado? ) Y el tercero en Python ( ¿Por qué Python no permite el uso de guiones nombres de funciones y variables? ).
El problema aquí es que, por defecto, el fuego tomará el nombre de los argumentos del código de Python, lo que significa que si mi código de Python se ve así:
script.py:
import fire
def main(name_of_cat='Steve'):
print(f'The name of the cast is {name_of_cat}')
if __name__ == '__main__':
fire.Fire(main)
luego, para llamarlo desde la línea de comando (o desde un script bash), uno haría
python script.py --name_of_cat Bob
Esta es la forma en que lo estoy usando en este momento, pero se siente subóptimo. ¿Alguna idea de cuál es la mejor práctica aquí?
PD: python script.py --name-of-cat Bobsería imposible ya que Python no puede tener un guión en los nombres de las variables.
Respuestas
Parece que funciona con guiones o guiones bajos, posiblemente debido a esta línea de código . Usando su secuencia de comandos:
> python .\script.py --name_of_cat Bob
The name of the cast is Bob
> python .\script.py --name-of-cat Bob
The name of the cast is Bob
Esto también se indica aquí en los documentos de Fire:
Para crear una instancia de ay
Buildingluego ejecutar laclimb_stairsfunción, los siguientes comandos son válidos:$ python example.py --name="Sherrerd Hall" --stories=3 climb_stairs 10 $ python example.py --name="Sherrerd Hall" climb_stairs --stairs_per_story=10 $ python example.py --name="Sherrerd Hall" climb_stairs --stairs-per-story 10 $ python example.py climb-stairs --stairs-per-story 10 --name="Sherrerd Hall"Notará que los guiones y los guiones bajos (
-y_) son intercambiables en los nombres de los miembros y los nombres de las banderas.
Sin embargo, el texto de ayuda generado parece pedir una bandera con guiones bajos:
> python .\script.py -h
INFO: Showing help with the command 'script.py -- --help'.
NAME
script.py
SYNOPSIS
script.py <flags>
FLAGS
--name_of_cat=NAME_OF_CAT
Mi recomendación es que si está creando un script rápido para usted, Fire es increíble, pero si está haciendo algo para distribuir o más complejo, es mejor usar un marco más configurable, como argparse (incluido en stdlib) o haga clic en (mi favorito personal). Aquí está la lista de beneficios declarada por Fire; si su caso de uso es más complejo, otra biblioteca podría ser mejor.
No estoy seguro sobre el Firemódulo, pero tengo una aplicación de línea de comandos de Python en la que estamos usando nameofcatsintaxis de tipos. Paso una palabra con hasta 17 aplhabets en total como argumento al guión y no uso ningún guión ni guión bajo.