Вы используете "глобальный" оператор в Python?

Я читал вопрос о глобальном заявлении Python ( "Python scope" ), и я помнил о том, как часто я использовал этот оператор, когда был новичком на Python (Я много использовал в глобальном масштабе), и как, в наши дни, спустя годы, я вообще не использую его. Я даже считаю это немного "непитоновым".

Вы используете этот оператор в Python? Изменилось ли ваше использование с течением времени?

Ответ 1

Я использую "глобальный" в контексте, таком как:

_cached_result = None
def myComputationallyExpensiveFunction():
    global _cached_result
    if _cached_result:
       return _cached_result

    # ... figure out result

    _cached_result = result
    return result

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

def myComputationallyExpensiveFunction():
    if myComputationallyExpensiveFunction.cache:
        return myComputationallyExpensiveFunction.cache

    # ... figure out result

    myComputationallyExpensiveFunction.cache = result
    return result
myComputationallyExpensiveFunction.cache = None

Ответ 2

У меня никогда не было законного использования для утверждения в любом производственном коде за 3 года профессионального использования Python и более пяти лет в качестве любителя Python. Любое состояние, которое мне нужно изменить, находится в классах или, если есть какое-то "глобальное" состояние, оно находится в некоторой общей структуре, такой как глобальный кеш.

Ответ 3

Я использовал его в ситуациях, когда функция создает или задает переменные, которые будут использоваться во всем мире. Вот несколько примеров:

discretes = 0
def use_discretes():
    #this global statement is a message to the parser to refer 
    #to the globally defined identifier "discretes"
    global discretes
    if using_real_hardware():
        discretes = 1
...

или

file1.py:
    def setup():
        global DISP1, DISP2, DISP3
        DISP1 = grab_handle('display_1')
        DISP2 = grab_handle('display_2')
        DISP3 = grab_handle('display_3')
        ...

file2.py:
    import file1

    file1.setup()
    #file1.DISP1 DOES NOT EXIST until after setup() is called.
    file1.DISP1.resolution = 1024, 768

Ответ 4

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

Итак, честно говоря, даже если бы это разрешилось, я бы так же старался избежать его использования. Даже если это означает, что простые классы создаются вокруг вашего фрагмента кода.

Ответ 5

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

Ответ 6

Я использую его для глобальных опций с помощью сценариев командной строки и "optparse":

my main() анализирует аргументы и передает их любой функции, выполняемой работой script..., но записывает предоставленные опции в глобальный словарь "opts".

Параметры оболочки script часто изменяют поведение "листа", и неудобно (и не нужно) прокручивать словарь "opts" через каждый список аргументов.

Ответ 7

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

Ответ 8

Редко. Я еще не нашел для этого никакого использования.

Ответ 9

Он может быть полезен в потоках для совместного использования (с механизмами блокировки вокруг него).

Однако я редко использую его.

Ответ 10

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

Ответ 11

Один или два раза. Но это была хорошая отправная точка для рефакторинга.

Ответ 12

Если я могу избежать этого, нет. И, насколько мне известно, всегда есть способ избежать этого. Но я не утверждаю, что это абсолютно бесполезно либо