Глава 10 • Файлы и исключения
В точке
программа запрашивает имя пользователя для сохранения. Затем вы-
зывается функция
json.dump()
, которой передается имя пользователя и объект
файла; функция сохраняет имя пользователя в файле
. Далее выводится сообще-
ние о том, что имя пользователя было сохранено
:
What is your name?
Eric
We'll remember you when you come back, Eric!
А теперь напишем другую программу, которая приветствует пользователя по ранее
сохраненному имени:
greet_user.py
import json
filename = 'username.json'
with open(filename) as f_obj:
username = json.load(f_obj)
print("Welcome back, " + username + "!")
В точке
вызов
json.load()
читает информацию из файла
username .json
в пере-
менную
username
. После того как данные будут успешно прочитаны, мы можем
поприветствовать пользователя по имени
:
Welcome back, Eric!
Теперь эти две программы необходимо объединить в один файл. Когда пользова-
тель запускает
remember_me .py
, программа должна взять имя пользователя из памя-
ти, если это возможно; соответственно, программа начинается с блока
try
, который
пытается прочитать имя пользователя. Если файл
username .json
не существует,
блок
except
запросит имя пользователя и сохранит его в
username .json
на будущее:
remember_me.py
import json
# Программа загружает имя пользователя, если оно было сохранено ранее.
# В противном случае она запрашивает имя пользователя и сохраняет его.
filename = 'username.json'
try:
with open(filename) as f_obj:
username = json.load(f_obj)
except FileNotFoundError:
username = input("What is your name? ")
with open(filename, 'w') as f_obj:
json.dump(username, f_obj)
print("We'll remember you when you come back, " + username + "!")
else:
print("Welcome back, " + username + "!")
Никакого нового кода здесь нет; просто блоки кода из двух предыдущих приме-
ров были объединены в один файл. В точке
программа пытается открыть файл
username .json
. Если файл существует, программа читает имя пользователя в па-
мять
и выводит сообщение, приветствующее пользователя, в блоке
else
. Если
Сохранение данных
207
программа запускается впервые, то файл
username .json
не существует, и происходит
исключение
FileNotFoundError
. Python переходит к блоку
except
, в котором
пользователю предлагается ввести имя
. Затем программа вызывает
json.dump()
для сохранения имени пользователя и выводит приветствие
.
Какой бы блок ни выполнялся, результатом является имя пользователя и соот-
ветствующее сообщение. При первом запуске программы результат выглядит
так:
What is your name?
Eric
We'll remember you when you come back, Eric!
Если же программа уже была выполнена хотя бы один раз, результат будет таким:
Welcome back, Eric!
Рефакторинг
Часто возникает типичная ситуация: код работает, но вы понимаете, что его струк-
туру можно усовершенствовать, разбив его на функции, каждая из которых ре-
шает свою конкретную задачу. Этот процесс называется
рефакторингом
(или
переработкой). Рефакторинг делает ваш код более чистым, понятным и простым
в расширении.
В процессе рефакторинга
remember_me .py
мы можем переместить основную часть
логики в одну или несколько функций. Основной задачей
remember_me .py
является
вывод приветствия для пользователя, поэтому весь существующий код будет пере-
мещен в функцию
greet_user()
:
remember_me.py
import json
def greet_user():
"""Приветствует пользователя по имени."""
filename = 'username.json'
try:
with open(filename) as f_obj:
username = json.load(f_obj)
except FileNotFoundError:
username = input("What is your name? ")
with open(filename, 'w') as f_obj:
json.dump(username, f_obj)
print("We'll remember you when you come back, " + username + "!")
else:
print("Welcome back, " + username + "!")
greet_user()
С переходом на функцию комментарии дополняются строкой документации, кото-
рая описывает работу кода в текущей версии
. Код становится немного чище, но
функция
greet_user()
не только приветствует пользователя — она также загружает
хранимое имя пользователя, если оно существует, и запрашивает новое имя, если
оно не было сохранено ранее.
208
Достарыңызбен бөлісу: |