Питон суперглобальный? - PullRequest
       15

Питон суперглобальный?

4 голосов
/ 10 апреля 2009

Есть ли суперглобальный (например, PHP) в Python? У меня есть определенные переменные, которые я хочу использовать по всему моему проекту в отдельных файлах, классах и функциях, и мне не нужно постоянно объявлять их в каждом файле.

Ответы [ 5 ]

19 голосов
/ 10 апреля 2009

Теоретически да, вы можете начать извергать крэда в __builtin __:

>>> import __builtin__
>>> __builtin__.rubbish= 3
>>> rubbish
3

Но не делай этого; это ужасное зло, которое вызовет у вас рак приложений.

классы и функции, и я не хочу продолжать объявлять

Поместите их в модули и «импортируйте» их, когда вам нужно их использовать.

У меня есть определенные переменные, которые я хочу использовать на протяжении всего моего проекта

Если вам нужны неквалифицированные значения, просто поместите их в файл с именем что-то вроде «mypackage / constants.py», а затем:

from mypackage.constants import *

Если они действительно являются «переменными» в том смысле, что вы изменяете их во время выполнения приложения, вам нужно начать инкапсулировать их в объекты.

4 голосов
/ 04 февраля 2011

за годы практики я очень разочаровался системой импорта python: она сложная и с ней трудно обращаться правильно. Кроме того, я должен поддерживать оценки импорта в каждом модуле, который я пишу, что является лаваш.

Пространства имен - очень хорошая идея, и они незаменимы - у php нет подходящих пространств имен, и это беспорядок.

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

Когда пространства имен оказались в фокусе сообщества javascript, Джон Резиг из jquery fame решил, что предоставление единственной переменной $ в глобальном пространстве имен - это путь, который минимально повлияет на глобальное пространство имен и обеспечит легкий доступ ко всему с помощью jquery.

аналогично, я экспериментировал с глобальной переменной g, и это работало до некоторой степени. в основном, у вас есть две опции: либо есть модуль запуска, который должен быть запущен до любого другого модуля в вашем приложении, который определяет, какие вещи должны быть доступны в g, поэтому он готов к работе, когда это необходимо. другой подход, который я попробовал, состоял в том, чтобы сделать g ленивым и реагировать на пользовательский импорт, когда требовалось новое имя; поэтому, когда вам понадобится g.foo.frob(42) в первый раз, механизм попробует что-то вроде import foo; g.foo = foo за кулисами. это было гораздо труднее сделать правильно.

В наши дни я почти полностью отключил систему импорта, за исключением стандартных библиотек и пакетов сайтов. Большую часть времени я пишу обертки для библиотек шлангов, так как 90% из них в любом случае имеют извилистые интерфейсы. те обертки, которые я затем публикую в глобальном пространстве имен, используя соглашения об орфографии, чтобы свести к минимуму риск коллизий.

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

позвольте мне добавить одно замечание, так как я почти наверняка получу некоторый пожар здесь: 99% всего импорта, сделанного людьми, которые религиозно защищают чистоту пространства имен, являются неправильными . доказательство? в первых строках вы прочтете любой модуль foo.py, который должен выполнять тригонометрию, например, from math import sin. теперь, когда вы правильно import foo и посмотрите на это пространство имен, что вы собираетесь найти? что-то с именем foo.sin. но это sin не является частью интерфейса foo, это просто помощник, оно не должно загромождать это пространство имен - следовательно, from math import sin as _sin или что-то подобное было бы правильно. однако почти никто так не поступает.

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

4 голосов
/ 10 апреля 2009

Даже если таковые имеются, вы не должны использовать такую ​​конструкцию НИКОГДА. Подумайте об использовании шаблона Борга для хранения такого рода вещей.

class Config:
    """
    Borg singlton config object
    """
    __we_are_one = {}
    __myvalue = ""

    def __init__(self):
        #implement the borg patter (we are one)
        self.__dict__ = self.__we_are_one

    def myvalue(self, value=None):
        if value:
           self.__myvalue = value
        return self.__myvalue

conf = Config()
conf.myvalue("Hello")
conf2 = Config()
print conf2.myvalue()

Здесь мы используем шаблон borg для создания синглтонного объекта. Независимо от того, где вы используете это в коде, «myvalue» будет одинаковым, независимо от того, в каком модуле или классе вы создаете экземпляр Config.

3 голосов
/ 10 апреля 2009

Создать пустой модуль superglobal.py.
В ваших файлах сделайте:

import superglobal
superglobal.whatever = loacalWhatever
other = superglobal.other
1 голос
/ 04 февраля 2011

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

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