Найти в Дзене

Розалия и её способности. Часть 5

Оглавление

В прошлый раз я описал навык Розалии искать в wikipedia. Этот навык далёк от совершенства. Читайте, переходите "Розалия приобретает навык"

Поиск в Wikipedia
Поиск в Wikipedia

В реализованном навыки из прошлой статьи есть два недостатка:

  1. Описан поиск только одного термина «Python». А я хочу, чтобы Розалия искала любой термин, какой задам.
  2. Писать программу в одном файле крайне неудобно. Я в дальнейшем собираюсь добавлять навыки Розалии. И если я буду писать все навыки в одном файле, файл разрастется до таких размеров, что мне будет трудно ориентироваться в коде.

Для устранения сих недостатков, отделю мозг от его способностей. Т.е. Розалия должна прочитать команду и обработать её. В зависимости от команды Розалия запускает навык и в качестве ответа выводит результат. Таким образом, я создам еще один файл «Rozalia. py» - это будет мозг Розалии. Идея аналогична ситуации, когда человеку нужно «подойти и что-то взять с полочки» мозг запускает способность ходить, потом протянуть руку, взять и т.д. Эти способности человек приобретает в ходе развития: способность ходить, говорить, писать. Одним за другим к человеку подключаются те или иные способности. Для Розалии же способность – написанный мной модуль. Например, в файле search_wiki.py я описал способность Розалии искать информацию в Wikipedia.

Я посылаю запрос и получаю результат
Я посылаю запрос и получаю результат

Как эту схему реализовать на языке Python?

Теперь запишу сказанное на языке логики. Есть некоторая функция, которая принимает различные значения, в зависимости от запроса – функция (запрос) или search_wikipedia(query). Переменная query определяет запрос, который я передаю Розалии. Вот как этот реализовать на языке Python:

функции
функции

Перепишу код в файле search_wiki.py следующим образом:

import wikipedia
query=input()
def search_wikipedia(query):
____wikipedia.set_lang("ru")
____return wikipedia.summary(query, - ____sentences=5)
print (search_wikipedia(query))

Символом "____" я показал клавишу табуляции. Командой query = input (), я говорю Python, что хочу ввести что-то с клавиатуры и то, что введу поместить в переменную query. Слово def определяет функцию с именем search_wikipedia. В фигурных скобках я указываю аргумент функции – переменную query. Знаком двоеточие указываю, что после него начинается описание функции - то что она должна делать. В нашем случае функции выполняет только одно действие - wikipedia.summary(query, sentences=5) - получает пять предложений описания термина query из ресурса wikipedia. А переменная query содержит значение, которое я ввожу с клавиатуры.

Как это работает?

Теперь запущу программу и посмотрю, как это работает.

Запуск программы search_wiki.py
Запуск программы search_wiki.py

После запуска программы, я вижу просто мигающий курсор. Программа ждет моего ввода с клавиатуры. Ввожу с клавиатуры -

Что такое Python

И после нажатия на ENTER переменная query принимает значение –

Что такое Python

Затем выполняется команда print (search_wikipedia(«Что такое Python»)) – эта команда выводит на экран результат выполнения функции search_wikipedia с аргументом «Что такое Python». В момент выполнения команды print происходит поиск описания действий функции search_wikipedia. Это описание находится после слова def. def –ключевое слово и Python понимает, что после def идет описание действий функции search_wikipedia. А ДЕЙСТВИЕ этой функции только одно – запрос к ресурсу Wikipedia

wikipedia.summary(«Что такое python», sentences=5).

Слово return перед wikipedia.summary(query, sentences=5) говорит Python присвоить функции search_wikipedia результат выполнения функции wikipedia.summary(query, sentences=5) - запись аналогична записи:

search_wikipedia(query)= wikipedia.summary(query, sentences=5).

Где query принимает значение, введенное мной с клавиатуры.

Начало описание функции и конец

После слова двоеточия идет описание действий функции.

def search_wikipedia(query):
____Описание действий функции

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

wikipedia.set_lang("ru")
return wikipedia.summary(query, sentences=5)

Python не сопоставит их с функцией search_wikipedia. А это значит, что данная функция будет не описана и программа при вызове данной функции выдаст ошибку.

Разогрелись не много…. Погнали дальше…

Истина в вине

Розалия и ее способности
Розалия и ее способности
Физика в вине - сказал поэт.

Но для начала, Розалии нужно взять бокал вина и истина окроется. Не буду делать Розалию пьющей. Поэтому и изобразил бокал и Розалию отдельно. И мне сейчас предстоит отделить Розалию от ее способностей. В файле search_wiki.py – описан навык Розалии, искать в Wikipedia, а в файле rozalia.py я опишу саму сущность Розалии. Для этого открываю файл search_wiki.py и вырежу строки

query=input()
print (search_wikipedia(query))

Т.е. в файле search_wiki.py я оставляю только способность Розалии искать в Wikipedia, а обработку запросов и вывод результатов переношу в её сущность – в файл Rozalia.py вставляю строки:

query=input()
print (search_wikipedia(query))

Но сущность Розалии пока не знает, что это за функция search_wikipedia(query), ведь она описана в файле search_wiki.py. Поэтому в начале файла сущности Розалии напишу import search_wiki.

Файл Rozalia.py
Файл Rozalia.py

Таким образом, я могу писать сколько угодно способностей Розалии и добавлять их к основной сущности.

Диалог с Розалией

Если я запущу программу Rozalia.py увижу мигающий курсор, который ждет моего ввода с клавиатуры. Но если бы не я написал код программы, то откуда бы знал, что он там мигает и чего хочет программа? Поэтому сделаю понятней, изменю строки:

query=input() =>>query(«Вы: »)
print (search_wikipedia(query))=>> print («Rozalia: » + search_wikipedia(query))
Выполнение программы Rozalia.py
Выполнение программы Rozalia.py

Программа работает! Розалия научилась писать и отвечать на вопросы. По мне так, что-то не то с выводом текста: мой запрос сливается с текстом Розалии. О, так было бы круче:

Изменения цвета диалога
Изменения цвета диалога

Но эту изюминку и многое другое я добавлю в следующий раз. Погружение в Python продолжается.