Python 3.3 представил contextlib.ExitStack
только для такой ситуации. Он дает вам «стек», к которому вы добавляете менеджеров контекста по мере необходимости. В вашем случае вы сделаете следующее:
from contextlib import ExitStack
with ExitStack() as stack:
if needs_with():
gs = stack.enter_context(get_stuff())
# do nearly the same large block of stuff,
# involving gs or not, depending on needs_with()
Все, что введено в stack
, автоматически exit
ed в конце инструкции with
, как обычно. (Если ничего не введено, это не проблема.) В этом примере все, что было возвращено get_stuff()
, автоматически exit
.
Если вам нужно использовать более раннюю версию python, вы можете иметь возможность использовать модуль contextlib2
, хотя это не является стандартным. Он поддерживает эту и другие функции в более ранних версиях python. Вы можете даже сделать условный импорт, если вам нравится этот подход.
Я заметил, что журнал не печатается даже при вызове в качестве второго параметра. Мне кажется, что функция this.setState () не работает. Он пропускает функцию this.setState () в методе validate ().
setState
не является синхронным, поэтому:
this.setState({ isAuthorized: authorized });
console.log(this.state.isAuthorized) // here logs the value prior of the setState
Если вы хотите войти сразу после setState, передайте обратный вызов в качестве второго параметра:
this.setState({ isAuthorized: authorized }, () => console.log(this.state.isAuthorized));