Я не говорю, что это лучше, но для полноты картины я хотел предложить функцию 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)