Можно ли поймать предупреждение и выбрать продолжить с того места, где оно прекратилось? - PullRequest
0 голосов
/ 27 июня 2018

Есть ли способ использовать предупреждение или исключение в python, которые позволили бы мне поднять контроль и затем взять его с того места, где он остановился?

def foo():
    #make a request
    r = request.get('someRestAPI')
    # get the data from request
    data = r.json()
    # determine the number of results the request will return
    num_results = data['num_results']
    if num_results > 1000:
         # raise a warning to be handled main
         # continue if the main doesn't catch
    results = []
    endpoint = data['next_page']
    while endpoint:
         # request the next page
         r = request.get(endpoint )
         data = r.json()
         results.append(data['result'])
         endpoint = data['next_page']

 def main():
     try:
         foo()
     catch warning:
         cont = input("Warning Over 1000 results, Continue?")
         if cont == 'y':
              # return to function call and continue

Цель примера выше - показать возможный вариант использования. Я делаю начальный запрос к REST API и определяю количество результатов, которые запрос даст. Если у меня слишком много результатов, я хочу временно передать управление в другую область программы, чтобы определить, следует ли нам продолжать.

Я знаю, что эта программа может быть структурирована по-разному для достижения этой цели, но мне любопытно, есть ли способ специально передать управление через повышение или предупреждение функции, которая ее вызывала, и затем позволить ей продолжить с того места, где она ушла выкл.

1 Ответ

0 голосов
/ 27 июня 2018

Я думаю, что есть лучшее решение вашей проблемы, и вам не нужны исключения и т. Д., Поскольку реальных ошибок / исключений не происходит.

Первый: создать больше модульности. Я лично предпочитаю делать много функций, которые имеют смысл. Я сделаю быстрое преобразование для тебя.

def main():
  data = get_data()
  if data['num_results'] > 1000:
    cont = input("Warning Over 1000 results, Continue?")
    if cont == 'y':
      results = process_data(data)
  if results is not None:
    #do things.

def get_data():
  r = request.get('someRestAPI')
  return r.json()

def process_data(data):
  results = []
  endpoint = data['next_page']
  while endpoint:
    # request the next page
    r = request.get(endpoint )
    data = r.json()
    results.append(data['result'])
    endpoint = data['next_page']
  return results

if __name__ == "__main__":
  main()

Теперь это не отвечает на вопрос, но реорганизует ваш код так, чтобы он был более плавным и не требовалось никаких исключений.

...