Обеспечение доступности всех переменных для пространства имен - PullRequest
3 голосов
/ 10 апреля 2010

Скажите, у меня есть простая функция:

def myfunc():
    a = 4.2
    b = 5.5
    ... many similar variables ...

Я использую эту функцию только один раз, и мне интересно, как проще всего сделать все переменные внутри функции доступными для моего основного пространства имен.

Должен ли я объявлять глобальный для каждого элемента? или какие-либо другие предлагаемые методы?

Спасибо.

Ответы [ 4 ]

8 голосов
/ 10 апреля 2010

Лучший способ, по моему предвзятому мнению, состоит в том, чтобы обернуть словарь в красивый объект, где «переменные» доступны как атрибуты - шаблон, который я назвал Bunch , когда я представил его много лет назад,и отличный пример последнего элемента в Zen of Python (если вы не знаете, что это такое, import this в интерактивной подсказке переводчика).То есть ...:

class Bunch(object):
    def __init__(self, d=None):
        if d is not None: self.__dict__.update(d)

def myfunc():
    a = 4.2
    b = 5.5
    ...
    return Bunch(locals())

x = myfunc()

print x.a, x.b

Использование квалифицированных имен , таких как x.a и x.b, вместо имен , таких как a и b, здесь ключевая идея: квалифицированные имена позволяют вам разделять пространства имен и правильно обращаться с ними, в то время как голые имена могут составить один большой суп из всего и нарушить Zen of Python ;-).И, конечно, нет необходимости использовать развернутый дикт и неприглядные x['a'], x['b'] доступы! -)

5 голосов
/ 10 апреля 2010

Если вам нужно разделить ваши константы, поместите их в другой модуль:

consts.py * * 1004

foo = 42
bar = 'quux'

main.py

import consts

print consts.foo
print consts.bar[::-1]
1 голос
/ 10 апреля 2010

Я не могу придумать какой-либо веской причины для этого, но если вы действительно хотите по какой-то странной причине:

def myfunc():
    x = 5.6
    y = 7.3
    # many other variables
    globals().update( locals() )

Это работает, потому что функция globals возвращает словарь глобальных переменных в пространстве имен вашего модуля, который вы можете динамически обновлять с помощью словаря всех локальных переменных, возвращаемых функцией locals .

Это очень опасно , потому что оно затрет все в вашем глобальном пространстве имен, поэтому, если у вас уже есть переменная x или y, они будут перезаписаны. И, как я уже сказал, я действительно не могу придумать вескую причину, чтобы когда-либо делать это, поэтому определенно подумайте дважды, прежде чем прибегать к подобному обману!

0 голосов
/ 10 апреля 2010

Похоже, то, что вы хотите сделать, не является естественным, потому что это не то, что вы обычно должны делать много.

Возможно, вы действительно хотите создать класс и настроить все эти вещи на его экземпляр.

class MyState(object):
    def __init__(self):
        self.a = 4.2
        self.b = 5.5
        ... many similar variables ...

Сохранение состояния в экземпляре создаваемого вами класса обычно очень сильно предпочтительнее, чем изменение глобального состояния. Этот метод также не требует никакой магии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...