Могу ли я использовать исключения, чтобы запустить повторную попытку рекурсивной функции в функции обертки в Python?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Могу ли я использовать исключения, чтобы запустить повторную попытку рекурсивной функции в функции обертки в Python?

Сообщение Anonymous »

Я строю приложение для консоли Python, и я использую функции, чтобы показать меню. Эти функции ждут ввода от пользователя, и иногда они должны быть подтверждены (как это должно быть либо «y», либо «n»). Когда ответ недействителен, следует отображать сообщение с неверным значением. Пользователь может нажать Enter, чтобы скрыть это сообщение, и меню должно быть записано на вывод снова, и пользователь может снова ввести выбор. Используя это, мне не нужно вручную вкладывать эти очистки в функцию меню. Это также позволяет функции вызвать себя своими собственными параметрами, всякий раз, когда она хочет сбросить свое состояние и меню, показанное на консоли, как: < /p>

Код: Выделить всё

import os

def clear_console(func):
def wrapper(*args, **kwargs):
os.system("cls")
result = func(*args, **kwargs)
os.system("cls")
return result
return wrapper

@clear_console
def invalid_input_menu():
input("Invalid input. Press ENTER to continue...")

@clear_console
def my_menu(some_data):
print(some_data)
is_this_data_correct = input("Is this data correct? (Y/N) ").strip().upper()
if is_this_data_correct not in {"Y", "N"}:
invalid_input_menu()
return my_menu(some_data)
return is_this_data_correct == "Y"
< /code>
Я использовал этот подход к тому, что мне пришлось добавить дополнительные параметры в одно из моих меню. Моя проблема заключается в том, что если к такой функции добавлены больше параметров, следует также обновлять его повторный вызов, например, если я хочу добавить еще один параметр в my_menu 
, я должен предоставить его значение для вызова my_menu , а также, когда код меню будет больше, что будет сформировать. Loop, но как обертка знает, если она будет повторить? Есть три подхода, о которых я думал: < /p>

Если меню возвращается с None -> Я не могу использовать это, когда я хочу, чтобы функция фактически не возвращала ни одного < /li>
Если меню возвращается с помощью пользовательских экземпляров класса, которые я определяю, чтобы указать, что я хочу повторить функцию -> ее полезной, потому что я могу вернуть информацию о валидации, но и для этого, но не в номинации, но не для того, чтобы не об этом, не в этом, но не в этом. И это странно, если его возвращение с некоторыми странными экземплярами класса < /li>
Если меню поднимает определенное исключение, обертка может поймать ее и повторить, чтобы назвать функцию меню -> звучит правильно, но я не думаю, что это обычное использование исключений < /li>
< /ul>
heres. PrettyPrint-Override ">import os

def clear_console(func):
def wrapper(*args, **kwargs):
os.system("cls")
result = func(*args, **kwargs)
os.system("cls")
return result
return wrapper

class InvalidInputRetryEvent(Exception):
def __init__(self, user_input):
self.user_input = user_input
@clear_console
def print_invalid_input_menu(self):
if not self.user_input:
msg = "Invalid input: empty value"
else:
msg = f"Invalid input: {self.user_input}"
input(msg)

def retryable(func):
def wrapper(*args, **kwargs):
while True:
try:
return func(*args, **kwargs)
except InvalidInputRetryEvent as e:
e.print_invalid_input_menu()
return wrapper

@retryable
@clear_console
def my_menu(some_data):
print(some_data)
is_this_data_correct = input("Is this data correct? (Y/N) ").strip().upper()
if is_this_data_correct not in {"Y", "N"}:
raise InvalidInputRetryEvent(user_input=is_this_data_correct)
return is_this_data_correct == "Y"

print(my_menu("aknwor anw\niwgnwinoi n\nowngwoijgwjg"))
< /code>
Как вы думаете, что это решение приемлемо? Если нет, то как еще я могу просто решить?


Подробнее здесь: https://stackoverflow.com/questions/795 ... r-function
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»