Изменить хранилище глобалов в 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_ ваши глобальные переменные, используйте один словарь в глобальном пространстве имен и доступ к ним оттуда или ваш собственный класс.

Удачи.

Другие вопросы по тегам