Последние несколько строк в сценарии more.py из примера 2.1 знакомят нас с одним из первых важных понятий в программировании инструментов командной строки. Они настраивают файл так, чтобы его можно было использовать двумя способами: как сценарий или как библиотеку.
Напомню, что в каждом модуле Python доступна встроенная переменная __name__, в которую интерпретатор Python записывает значение __main__, только если файл выполняется как программа, а не импортируется в качестве библиотеки. Благодаря этому функция more в этом файле автоматически выполняется в последней строке файла, когда сценарий запускается, как самостоятельная программа, а не импортируется в какое-либо другое место. Этот простой прием является ключом к созданию многократно используемых сценариев: благодаря реализации логики программы в виде функции, а не в виде программного кода верхнего уровня, ее можно импортировать и повторно использовать в других сценариях.
В результате появляется возможность запускать more.py отдельно или импортировать его и вызывать функцию more из любого другого места. При запуске файла как самостоятельной программы мы передаем ей в командной строке имя файла, который нужно прочесть и выводить постранично: в следующей главе будет полностью описано, как слова, вводимые в команде для запуска программы, появляются во встроенном списке sys.argv. Ниже приводится пример запуска файла сценария для постраничного вывода самого себя (эта команда должна выполняться в каталоге PP4E\System, иначе входной файл не будет найден; причина этого будет пояснена позднее):
C:\…\PP4E\System> python more.py more.py
разбивает строку или текстовый файл на страницы для интерактивного просмотра
def more(text, numlines=15):
lines = text.splitlines() # подобно split(‘\n’), но без ‘’ в конце
while lines:
chunk = lines[:numlines] lines = lines[numlines:] for line in chunk: print(line)
if lines and input(‘More?’) not in [‘y’, ‘Y’]: break
if __name__ == ‘__main__’:
import sys # если запускается как сценарий
more(open(sys.argv[1]).read(), 10) # отобразить постранично содержимое
# файла, указанного в командной строке
Если мы импортируем файл more.py, мы явно передаем строку в его функцию more; функция more — как раз такая утилита, которая нам нужна для просмотра текста документации. Запуск этой утилиты для просмотра строки документации модуля sys представит информацию о том, какие возможности дает этот модуль сценариям, в виде, пригодном для чтения:
C:\…\PP4E\System> python
> >> from more import more
> >> import sys
> >> more(sys.__doc__)
This module provides access to some objects used or maintained by the interpreter and to functions that interact strongly with the interpreter.
Dynamic objects:
argv — command line arguments; argv[0] is the script pathname if known path — module search path; path[0] is the script directory, else ‘’ modules — dictionary of loaded modules
displayhook — called to show results in an interactive session
excepthook — called to handle any uncaught exception other than SystemExit To customize printing in an interactive session or to install a custom top-level exception handler, assign other functions to replace these.
stdin — standard input file object; used by input() More?
Нажатие клавиши у или Y заставит функцию отобразить несколько следующих строк документации и снова вывести приглашение, если список строк еще не закончился. Попробуйте сделать это у себя, и вы увидите, как выглядит оставшаяся часть строки документации. Кроме того, попробуйте поэкспериментировать, задавая размер окна во втором аргументе, — вызов more(sys.__doc__, 5) будет выводить текст блоками по 5 строк.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011