29 февраля 2020 года состоялся официальный микро-релиз библиотек smart-env и python-shell. Тем, кто не в курсе, предлагаю предварительно прочитать первый пост.
Если вкратце, то среди изменений — автодополнение команд, расширение возможностей по запуску команд, немного рефакторинга и багфиксов.
Что нового в python-shell?
Начну сразу с десерта.
Автодополнение команд
Согласитесь — удобно, когда редактор/IDE/терминал подсказывает название команды, а иногда и параметры вызова? Вот и python-shell понемногу продвигается в обеспечении подобного функционала. В связи с тем, что поля класса Shell под капотом de-facto не являются его полями (вездесущий __getattr__), автодополнение создано также с нуля (перегрузкой, соответственно, метода __dir__). В данный момент автодополнение работает средах BPython и IPython. Конечно, хочется увидеть интеграцию с более маститыми продуктами вроде PyCharm, и в этом направлении идет изучение возможностей реализации.
Добавление свойств
В рамках релиза класс Shell получил новое свойство last_command. Потребность в нем возникла вследствие того, что при генерации исключения ShellException командой с ненулевым кодом возврата объект Command не возвращался из вызова __call__() объекта команды. Теперь же есть возможность сделать так:
try: command = Shell.touch('/foo.txt') except ShellException: command = Shell.last_command
Также расширился список свойств объекта Command. Добавлено поле errors, которое возвращает вывод команды в поток ошибок.
Запуск команд с Python-невалидными именами
Практически в любой системе есть хоть одна программа, название которой не подходит в качестве идентификатора в Python (например, известная утилита 2to3). Вызвать ее с помощью
Shell.2to3()
не получится — интерпретатор не пропустит.
Решение — вызвать команду обходным путем:
Shell("2to3") # возвращает объект команды
Стоит заметить, что таким же образом можно запускать и валидные с точки зрения интерпретатора команды, что оставляет возможность делать гибкие скрипты вроде
cmd = "python{}".format(sys.version_info[0]) Shell(cmd)(*args, **kwargs)
Мелкие изменения
1. Реализованы методы __repr__() и __str__() объекта класса Command, которые теперь выдают интуитивно понятные значения (команду с параметрами и ее stdout-выхлоп соответственно).
2. Мелкие исправления по коду.
3. Добавление покрытия тестами, а также реорганизация существующих.
4. Добавление классов Subprocess и Process, цель которых — создание дополнительного уровня абстракции при работе с модулем subprocess. По большей части, необходимо для устранения повторений кода при работе с Python 2/3, но потенциально может и дать и другие бонусы.
Что нового в smart-env?
В отличие от python-shell, в библиотеке smart-env изменений произошло меньше. Причина тому простая — нехватка свободного времени, в ходе чего некоторые потенциальные улучшения (например, автодополнение переменных окружения) были перенесены на следующий релиз.
По факту, в библиотеке сделаны следующие изменения:
1. Мелкие исправления по коду.
2. Рефакторинг.
3. Реорганизация и доработка имеющихся тестов.
Планы по следующим релизам
Библиотека python-shell
- Добавление поддержки неблокирующих вызовов команд (параллелизация выполнения).
Библиотека smart-env
- Реализация автодополнения переменных окружения в классе ENV.
- Поддержка оператора in для проверки существования env-переменной.
- Реализация поддержки функций str() и repr() для класса ENV.
О датах следующих релизов будет дополнительно объявлено в следующих каналах связи:
- Telegram-канал (публичный)
- Апдейтом в данной статье.
ссылка на оригинал статьи https://habr.com/ru/post/490542/
Добавить комментарий