Ваш подход не работает, потому что вы немедленно вызываете функции input()
или time.sleep()
при создании словаря. time.sleep()
, например, возвращает None
, и именно поэтому вы получаете ошибку.
Эти функции нужно вызывать позже , когда вы получили значение из словаря и фактическихотите «медленно распечатать» описание.
Вы можете сделать это разными способами. Вы можете
использовать последовательность (например, список или кортеж) строк вместо одной строки, и ваша функция slowprint()
может принять последовательность и сделать паузу после печати каждого элемента.
использовать последовательность строк и смешивать специальные значения, которые slowprint()
ищет для выполнения различных задач, например, для сна или запроса ввода.
Сохраните функцию в словаре, которую вы затем вызываете. Функции тоже объекты, как строки. Функция будет обрабатывать все операции печати и паузы.
Например, для хранения кортежа строк:
EXAMINATION: (
"The grass in this field is extremely soft.",
"The wind feels cool on your face.",
"The sun is beginning to set.",
)
, тогда ваш дескриптор функции slowprint()
будет:
def slowprint(lines):
"""Print each line with a pause in between"""
for line in lines:
print(line)
input("> ") # or use time.sleep(2), or some other technique
Второй вариант, для вставки специальных значений, дает вам больше возможностей делегировать все виды дополнительной функциональности другому коду. Вам нужно будет проверить тип объекта в последовательности, но это позволит вам вставить произвольные действия в описание экзамена. Как разница между сном и запросом пользователя о нажатии клавиши:
class ExaminationAction:
def do_action(self):
# the default is to do nothing
return
class Sleep(ExaminationAction):
def __init__(self, duration):
self.duration = duration
def do_action(self):
time.sleep(self.duration)
class Prompt(ExaminationAction):
def __init__(self, prompt):
self.prompt = prompt
def do_action(self):
return input(self.prompt)
и функция slowprint()
ищет следующие случаи:
def slowprint(examine_lines):
for action_or_line in examine_lines:
if isinstance(action_or_line, ExamineAction):
# special action, execute it
action_or_line.do_action()
else:
# string, print it
print(action_or_line)
Вы можете сделать любое числотакие действия;Дело в том, что все они подкласс ExamineAction
, поэтому их можно отличить от простых строк. Поместите их в свою последовательность для клавиши EXAMINATION
:
EXAMINATION: (
"The grass in this field is extremely soft.",
Prompt("> "),
"The wind feels cool on your face.",
Sleep(2),
"The sun is beginning to set.",
)
Возможности бесконечны.