Как мне изменить глобальные переменные внутри функции? - PullRequest
2 голосов
/ 22 июня 2019

Я пытался очистить свой код для симулятора эволюции нейронной сети, над которым я работаю, потому что он вырос до 1000 строк и его очень трудно читать. Часть этого процесса включает перемещение блоков кода из основного цикла в их собственные функции (обработка событий, рисование на экран и т. Д.) Или в свои собственные модули. Однако у меня возникают проблемы с выяснением того, как обращаться с глобальными переменными.

В качестве примера, у меня есть переменная с именем «selected», которая отслеживает конкретное существо нейронной сети, выбранное пользователем. Я хочу изменить значение этой переменной в функции обработки событий, когда пользователь нажимает на новое существо; Я также хочу изменить его значение, когда существо умирает, что происходит в другом блоке кода в его собственной функции.

Я понимаю, что могу использовать ключевое слово "global" для этого, но у меня сложилось впечатление, что это обычно плохая практика. Я также знаю, что могу хранить эти переменные в отдельном модуле и импортировать их, но когда я имею дело с более чем 30 переменными, ввод «module_name.variable_name» каждый раз, когда я хочу изменить их, кажется излишне утомительным. Я также подумывал о том, чтобы сохранить все эти значения в глобальном словаре, чтобы я мог изменить их изнутри функций, но, опять же, ввод «dict_name ['var_name']» каждый раз кажется ненужным.

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

1 Ответ

2 голосов
/ 22 июня 2019

30 глобальных переменных это просто большое нет-нет.В какой-то момент вы забудете оператор global и создадите локальную переменную и потратите часы на отладку кода.

вместо этого вы можете создать объект-одиночку

из:

a = 12
b = 33
c = "foo"

def run():
   global a
   if a == 34:
      # do something
      a += 1

вы можете создать большой класс обёртывания со всеми переменными в качестве членов:

class Program:
   def __init__(self):
     self.a = 12
     self.b = 33
     self.c = "foo"

теперь вы можете получить доступ ко всем вашим переменным с префиксом self.Это может быть утомительно, но, по крайней мере, оно короткое, и большинство хороших IDE (pycharm, pyscripter, eclipse) предлагают завершение (намного лучше, чем словарь, в котором вы не можете получить завершение)

# let's say it's the main method
def run(self):
   if self.a == 34:
      # do something
      self.a += 1

сейчас:

o = Program()
o.run()
print(o.a)  # without __ prefix, your data is visible from the outside

Таким образом, использование объекта не для наследования, полиморфизма или чего-то подобного, а просто для определения «глобального» контекста и работы внутри экземпляра с префиксом self. и прощания с global переменными.

...