25 марта 2016 г.

Недавно я создавал приложение командной строки для интервью по программированию на основе проекта. Я хотел, чтобы приложение имело определенную степень интерактивности, но по разным причинам я не мог легко сохранить состояние сохранения приложения на основе файла, что позволило бы мне использовать некоторые модули CLI, которые есть в Python.

Я чувствовал себя немного застрявшим, потому что хотел что-то вроде интерпретатора Python, но с поведением, которое я определил. Все модули CLI, казалось, допускали только «однократные» команды, а я хотел что-то постоянное и позволяющее пользователю выполнять несколько команд по желанию.

Мое решение «на лету» было неуклюжим. Манипуляции со строками для получения последовательностей команд, а затем каскадные условия для проверки и выполнения функций. Это работало (в основном) и имело пользовательский интерфейс, который я хотел, но решение казалось, что я излишне изобрел велосипед — и довольно неэлегантным образом.

Немного погуглив, я нашел то, что, по моему мнению, может быть лучшим решением. Класс кода в Python позволяет вам эмулировать функции интерпретатора Python, что означает, что вы можете встроить сеанс интерпретатора в свой проект.

Как показано в этом ответе Stack Overflow, 6 строк кода дадут вам полностью работающий интерпретатор:

import readline
import code
vars = globals().copy()
vars.update(locals())
shell = code.InteractiveConsole(vars)
shell.interact()

Не обращайте внимания на мой первоначальный вариант использования, я вижу, что это чрезвычайно полезно в качестве инструмента отладки. (Да, вы можете сделать то же самое с pdb, но это может быть так же быстро, как оператор печати, если вы настроите макрос.)

Вы также получаете множество улучшений качества жизни, таких как сохраненная история, Ctrl-C и так далее.

У него есть недостаток, заключающийся в том, что он не так «заблокирован», как мое решение, и (что является характерным недостатком Python) вы можете напортачить много вещей, если у вас есть неограниченный доступ ко всему, что вы хотите в моем модуле. .

Итак, это не идеальное решение.

Тем не менее, это еще раз доказывает, что вы можете делать интересные вещи, копаясь в загадочном мире основных функций Python.

Первоначально опубликовано на сайте benjamincongdon.me 25 марта 2016 г.