Почему я всегда получаю информацию о типе, напечатанную при использовании python fire?

#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