М97 Изучаем Python: программирование игр, визуализация данных, веб-приложения



Pdf көрінісі
бет161/334
Дата18.10.2023
өлшемі6,19 Mb.
#186390
1   ...   157   158   159   160   161   162   163   164   ...   334
Байланысты:
Изучаем Python

remember_me.py
import json
def greet_user():

"""Приветствует пользователя по имени."""
filename = 'username.json'
try:
with open(filename) as f:
username = json.load(f)
except FileNotFoundError:
username = input("What is your name? ")
with open(filename, 'w') as f:
json.dump(username, f)
print(f"We'll remember you when you come back, {username}!")
else:
print(f"Welcome back, {username}!")
greet_user()
С переходом на функцию комментарии дополняются строкой документации, кото-
рая описывает работу кода в текущей версии 

. Код становится немного чище, но 
функция 
greet_user()
не только приветствует пользователя — она также загружает 
хранимое имя пользователя, если оно существует, и запрашивает новое имя, если 
оно не было сохранено ранее.
Переработаем функцию 
greet_user()
, чтобы она не решала столько разных задач. 
Начнем с перемещения кода загрузки хранимого имени пользователя в отдельную 
функцию:
import json
def get_stored_username():

"""Получает хранимое имя пользователя, если оно существует."""
filename = 'username.json'
try:
with open(filename) as f:
username = json.load(f)
except FileNotFoundError:


220
Глава 10 • Файлы и исключения

return None
else:
return username
def greet_user():
"""Приветствует пользователя по имени."""
username = get_stored_username()

if username:
print(f"Welcome back, {username}!")
else:
username = input("What is your name? ")
filename = 'username.json'
with open(filename, 'w') as f:
json.dump(username, f)
print(f"We'll remember you when you come back, {username}!")
greet_user()
Новая функция 
get_stored_username()
имеет четкое предназначение, изложенное 
в строке документации 

. Эта функция читает и возвращает сохраненное имя 
пользователя, если его удается найти. Если файл 
username .json
не существует, то 
функция возвращает 
None

. И это правильно: функция должна возвращать либо 
ожидаемое значение, либо 
None
. Это позволяет провести простую проверку воз-
вращаемого значения функции. В точке 

программа выводит приветствие для 
пользователя, если попытка получения имени пользователя была успешной; в про-
тивном случае программа запрашивает новое имя пользователя.
Из функции 
greet_user()
стоит вынести еще один блок кода. Если имя пользова-
теля не существует, то код запроса нового имени должен размещаться в функции, 
специализирующейся на решении этой задачи:
import json
def get_stored_username():
"""Получает хранимое имя пользователя, если оно существует."""
...
def get_new_username():
"""Запрашивает новое имя пользователя."""
username = input("What is your name? ")
filename = 'username.json'
with open(filename, 'w') as f:
json.dump(username, f)
return username
def greet_user():
"""Приветствует пользователя по имени."""
username = get_stored_username()
if username:
print(f"Welcome back, {username}!")
else:
username = get_new_username()
print(f"We'll remember you when you come back, {username}!")
greet_user()


Итоги
221
Каждая функция в окончательной версии 
remember_me .py
имеет четкое, конкретное 
предназначение. Мы вызываем 
greet_user()
, и эта функция выводит нужное при-
ветствие: либо для уже знакомого, либо для нового пользователя. Для этого функ-
ция вызывает функцию 
get_stored_username()
, которая отвечает только за чтение 
хранимого имени пользователя (если оно есть). Наконец, функция 
greet_user()
при необходимости вызывает функцию 
get_new_username()
, которая отвечает толь-
ко за получение нового имени пользователя и его сохранение. Такое «разделение 
обязанностей» является важнейшим аспектом написания чистого кода, простого 
в сопровождении и расширении.


Достарыңызбен бөлісу:
1   ...   157   158   159   160   161   162   163   164   ...   334




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет