Согласно документации exec ,
Если exec получит два отдельных объекта как глобальные и локальные, код будет выполнен так, как если бы он был встроен в определение класса.
Итак, ваш код config.py эквивалентен
class SomeClass:
import collections as col
a = col.defaultdict()
class Foo:
b = col.defaultdict()
Это проблема, потому что, согласно Разрешение имен ,
Область имен, определенных в блоке класса, ограничена блоком класса [.]
col
определена в блоке класса неявного SomeClass
.Область действия этой переменной ограничена только этим блоком класса;даже блоки внутри этого блока, такие как class Foo:
, не могут получить к нему доступ.
Одно из возможных решений - передать один и тот же объект для globals
и locals
, чтобы ваш код не был выполняется так, как если бы он был встроен в определение класса.
exec(f.read(), CONFIG, CONFIG)