#python #command-line-interface #python-fire
#python #интерфейс командной строки #python-fire
Вопрос:
У меня есть простая тестовая программа cli для python-fire на python 2.7.15
import fire
class Math:
def add(x, y):
"""add"""
return x y
def multiply(x, y):
"""multiply"""
return x * y
if __name__ == '__main__':
fire.Fire(Math)
Если я напишу
python-fire-test.py
ответ от программы
Type: instance
String form: <__main__.Math instance at 0x0000000003CE89C8>
Usage: python-fire-test.py
python-fire-test.py add
python-fire-test.py multiply
Однако я не ожидаю увидеть
Type: instance
String form: <__main__.Math instance at 0x0000000003CE89C8>
напечатано вверху. Могу ли я остановить это поведение?
Ответ №1:
Это поведение было заменено более чистым выводом в Python Fire версии 0.2.0. Обновите Fire с помощью pip install -U fire
, чтобы получить последнюю версию.
Комментарии:
1. Не совсем. Основная проблема связана с использованием. Согласно README, операция должна быть указана вместе со значениями для вычисления результата. например,
python python-fire-test.py add 5 5
я считаю, что это правильный способ.
Ответ №2:
У вас две проблемы в вашем коде. Более непосредственный ответ на вопрос, почему вы на самом деле получаете результат, который вы видите, заключается в неправильном использовании библиотеки.
Результат, который вы получаете, на самом деле является просто результатом fire.Fire(Math)
, который является представлением объекта экземпляра, который вы получаете из fire.Fire(Math)
.
Ваше использование на самом деле должно быть таким:
(venv) ➜ python python-fire-test.py multiply 5 5
25
(venv) ➜ python python-fire-test.py add 5 5
10
Однако, есть еще одна проблема, с которой вы сталкиваетесь, которая и сейчас не даст вам такого результата. В вашем коде вы создаете класс с именем Math
. В ваших методах экземпляра ( add
, multiply
) вы столкнетесь с проблемами при попытке его использования из-за того, что вы не передаете необходимую явную ссылку для самого экземпляра self
. Итак, ваш код теперь должен быть:
импорт fire
class Math:
def add(self, x, y):
"""add"""
return x y
def multiply(self, x, y):
"""multiply"""
return x * y
if __name__ == '__main__':
fire.Fire(Math)
Чуть дальше в README для используемой вами библиотеки использование показано как:
python calculator.py double 10 # 20
python calculator.py double --number=15 # 30