Ответ 1
У компилятора нет возможности узнать, экспортирует ли модуль времени объекты с именем time
.
Свободные переменные вложенных функций привязаны к ячейкам закрытия во время компиляции. Ячейки Closure сами указывают на (локальные) переменные, определенные в скомпилированном коде, а не на глобальные, которые вообще не привязаны. См. модель данных python; функции ссылаются на их глобальные переменные с помощью атрибута func_globals
, а атрибут func_closure
содержит последовательность замыкающих ячеек (или None
).
Таким образом, вы не можете использовать динамический оператор импорта во вложенной области.
А зачем вложенным функциям вообще нужны закрывающие ячейки? Поскольку вам нужен механизм для ссылки на локальные переменные функции, когда сама функция завершена:
def foo(spam):
def bar():
return spam
return bar
afunc = foo('eggs')
Вызвав foo()
, я получил вложенную функцию, которая ссылается на переменную с областью, и компилятор должен создать необходимые ссылки для интерпретатора, чтобы снова получить эту переменную области. Следовательно, ячейки и ограничения на них.