Python Fire дефис против подчеркивания
Пакет python Fireочень полезен для запуска скриптов python из командной строки. Часто бывает, что аргументы состоят из нескольких слов, например, имя кота, которое можно записать тремя общими способами:
- nameofcat
- name_of_cat
- кличка
В то время как первый совместим практически со всем, второй следует избегать в bash ( должны ли параметры командной строки в операционных системах в стиле POSIX быть подчеркнутыми? ), А третьего в python ( почему python запрещает использование дефисов внутри имена функций и переменных? ).
Проблема здесь в том, что по умолчанию fire будет принимать имя аргумента из кода python, что означает, что если мой код python выглядит так:
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)
затем, чтобы вызвать его из командной строки (или из сценария bash), можно было бы сделать
python script.py --name_of_cat Bob
Сейчас я использую именно так, но это кажется неоптимальным. Есть идеи, какие здесь лучшие практики?
PS: python script.py --name-of-cat Bobбыло бы невозможно, поскольку python не может иметь дефис в именах переменных.
Ответы
Похоже, он работает с дефисами или подчеркиванием, возможно, из-за этой строки кода . Используя ваш скрипт:
> 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
Это также отмечено здесь, в документации Fire:
Чтобы создать экземпляр
Buildingи затем запуститьclimb_stairsфункцию, допустимы все следующие команды:$ 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"Вы заметите, что дефисы и подчеркивания (
-и_) взаимозаменяемы в именах элементов и именах флагов.
Однако сгенерированный текст справки, похоже, запрашивает флаг с подчеркиванием:
> 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
Я рекомендую, если вы делаете быстрый сценарий для себя, Fire - это круто, но если вы делаете что-то для распространения или более сложное, лучше использовать более настраиваемый фреймворк, например argparse (включен в stdlib) или нажмите (мой личный фаворит). Вот самопровозглашенный список преимуществ Fire; если ваш вариант использования более сложный, может быть лучше другая библиотека.
Не уверен насчет Fireмодуля, но у меня есть приложение командной строки python, в котором мы используем nameofcatсинтаксис типов. В качестве аргумента скрипту я передаю слово, содержащее до 17 аплабетов, и не использую никаких дополнительных символов или подчеркиваний.