Поведение Python при присвоении глобальных переменных с последующим исключением - PullRequest
0 голосов
/ 26 октября 2019

Я пишу функцию Python, которая выполняет длительные вычисления. Вычисления нуждаются в тщательной отладке, поэтому моя идея состоит в том, чтобы сохранить состояние глобального состояния, чтобы иметь возможность просматривать его в IPython. Если это важно, состояние - это модель TensorFlow, а вычисление - это его обучение. (Исправление 1: на самом деле это не важно) Конечно, если я вижу, что тренировка проходит не очень хорошо, я не хочу ждать, пока она завершится, и нажимаю Ctrl + C в IPython в надежде просмотреть M.model, внести некоторые исправления и т. Д.

К сожалению, если я попрошу IPython напечатать значение M после исключения KeyboardInterrupt, яНикого бы не увидел! Но как это может быть? Я почти уверен, что обучение уже началось, поэтому строка M=Model() должна быть уже выполнена.

Исправление 2: Оказывается, важно загрузить файл в IPython, используя from test import * синтаксис.


MCVE:

# Instructions
# 0. Save this program to test.py file.
# 1. Load the file in IPython with `from test import *` syntax
# 2. call `run()`, wait for some short time.
# 3. Interrupt it with Ctrl+C
# 4. See no global state changed

from typing import Any,Optional
from time import sleep

class Model:
  state:Any

def train(m:Model)->None:
  m.state = 0
  print('Hit Ctrl+C to interrupt "training". Check out (the absence of) M.state')
  while True:
    m.state = m.state + 1
    print('.', end='', flush=True)
    sleep(1)

M:Optional[Model]=None

def run():
  global M
  M=Model()
  train(M)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...