Изменить хранилище глобалов в python
Я хотел бы изменить хранилище всех глобальных переменных в скрипте Python, как если бы я мог просто написать use_this_dict_for_globals (some_dict).
Все они имеют префикс "g_", поэтому, если бы я мог заменить "g_" на "some_dict". чтобы изменить все эти переменные доступ, это будет работать тоже. Я бы на самом деле предпочел бы этот способ, но в Python мне либо нужно было бы использовать переменные доступы, такие как foo['bar'], а не foo.bar, или мне, очевидно, нужны некоторые вещи класса python (?), О которых я ничего не знаю.
Есть ли быстрый / надежный способ сделать это?
Обновление: поскольку все ответы указывают, вы можете использовать экземпляр класса, например, словарь, без ограничений, foo.bar = 123. Вы просто не можете использовать эту нотацию со словарями (как вы можете сделать в Lua с таблицами), что приводит я думаю, что не будет никакого способа вообще. Спасибо за вашу помощь.
3 ответа
Вы можете использовать этот "материал класса Python" для реализации одного объекта, содержащего все ваши глобальные переменные. Обратите внимание, что я не думаю, что это хороший подход в целом, но он очень близок к тому, что вы намеревались сделать.
В начале вашего скрипта определите класс MyGlobals
и получить экземпляр этого:
class MyGlobals(object):
pass
g = MyGlobals()
Вы можете получить доступ к объекту g
в любой момент в вашем скрипте, как это:
g.foo = "foo"
print g.foo
Но, как отмечено в комментариях, старайтесь избегать глобальных переменных и посмотрите, сможете ли вы чаще использовать ООП.
Я бы разбил все на модули, и держался подальше от глобальных вещей.
Имейте один модуль, который имеет все ваши глобальные переменные, а затем передайте экземпляр этого в другие модули, которые нуждаются в этом.
class doSomeThing(object):
def __init__(self, config):
self.config = config
def some_func(self):
# something
pass
class Global_Config(object):
def __init__(self, params):
# load global information
if __name__ == "__main__":
# construct the config
config = Global_Config(some params)
one = doSomething(config)
two = doSomethingTwo(config)
# do stuff with do some work with one and two and config
Если у вас есть переменные в глобальном пространстве имен с именем как g_var1
а также g_var2
(кстати, очень плохо), вы можете получить к ним доступ с помощью:
some_dict = {varname[2:]: var for varname, var in globals().iteritems() if varname.startswith('g_')}
Вы получите диктат some_dict
со всеми глобальными переменными, которые начинаются с g_
, Вы можете получить к ним доступ с some_dict['var1']
,
Но не делайте этого, если вам абсолютно не нужно. Используйте классы и модули / пакеты. Простой пример:
class SomeClass(object):
def __init__(self):
self.var1 = 'whatever'
self.var2 = 'whatever also'
c = SomeClass()
print c.var1, c.var2
Для получения дополнительной информации читайте о классах и модулях (import some_module
и тому подобное).
Заключение:
Не префикс с g_
ваши глобальные переменные, используйте один словарь в глобальном пространстве имен и доступ к ним оттуда или ваш собственный класс.
Удачи.