Я не говорю, что это лучше, но для полноты я хотел предложить функцию exec
, доступную как в python 2, так и 3. exec
позволяет вам для выполнения произвольного кода в глобальной области или во внутренней области, предоставляемой в качестве словаря.
Например, если у вас есть модуль, хранящийся в "/path/to/module
"с функцией foo()
, вы может запустить его, выполнив следующие действия:
module = dict()
with open("/path/to/module") as f:
exec(f.read(), module)
module['foo']()
Это делает несколько более явным, что вы загружаете код динамически и предоставляете вам дополнительную мощность, например, возможность предоставления настраиваемых встроенных функций.
И если вам нужен доступ через атрибуты, а не ключи, вы можете создать пользовательский класс dict для глобальных переменных, который обеспечивает такой доступ, например:
class MyModuleClass(dict):
def __getattr__(self, name):
return self.__getitem__(name)