Вы используете "глобальный" оператор в 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
Если я могу избежать этого, нет. И, насколько мне известно, всегда есть способ избежать этого. Но я не утверждаю, что это абсолютно бесполезно либо