Python Fire hífen vs sublinhado
O pacote python Fireé muito útil para iniciar scripts python da linha de comando. Uma coisa comum é ter argumentos compostos por várias palavras, por exemplo, o nome do gato que pode ser escrito de 3 maneiras comuns:
- nome de gato
- name_of_cat
- nome-do-gato
Embora o primeiro seja compatível com quase tudo, o segundo deve ser evitado no bash (as opções de linha de comando em sistemas operacionais estilo POSIX devem ser no estilo sublinhado? ) E o terceiro em python ( por que o python não permite o uso de hifens dentro nomes de funções e variáveis? ).
O problema aqui é que, por padrão, o fogo pegará o nome dos argumentos do código Python, o que significa que se meu código Python for assim:
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)
em seguida, para chamá-lo da linha de comando (ou de um script bash), seria necessário
python script.py --name_of_cat Bob
É assim que estou usando no momento, mas parece subótimo. Alguma ideia de quais são as melhores práticas aqui?
PS: python script.py --name-of-cat Bobseria impossível, pois python não pode ter hífen nos nomes das variáveis.
Respostas
Parece que funciona com hifens ou sublinhados, possivelmente por causa desta linha de código . Usando seu script:
> 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
Isso também é observado aqui nos documentos do Fire:
Para instanciar a
Buildinge executar aclimb_stairsfunção, os seguintes comandos são todos 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"Você notará que hifens e sublinhados (
-e_) são intercambiáveis em nomes de membros e nomes de sinalizadores.
No entanto, o texto de ajuda gerado parece pedir um sinalizador com sublinhados:
> 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
Minha recomendação é que se você está fazendo um script rápido para si mesmo, Fire é incrível, mas se você está fazendo algo para ser distribuído ou mais complexo, é melhor usar um framework mais configurável, como argparse (incluído no stdlib) ou clique em (meu favorito). Aqui está a lista auto-declarada de benefícios de Fire; se o seu caso de uso for mais complexo, outra biblioteca pode ser melhor.
Não tenho certeza sobre o Firemódulo, mas tenho um aplicativo de linha de comando python onde estamos usando a nameofcatsintaxe de tipo. Eu passo uma palavra com até 17 aplhabets no total como argumento para o script e não uso nenhum hífen ou sublinhado.