我一直在尝试为正在使用的神经网络进化模拟器清理代码,因为它已经增长到1000多个行,而且很难阅读。该过程的一部分涉及将代码块从主循环移动到它们自己的功能(事件处理,绘制到屏幕等)或他们自己的模块中。但是,我在弄清楚如何处理全局变量时遇到了麻烦。
作为一个例子,我有一个名为“ selected”的变量,它跟踪用户选择的特定神经网络生物。当用户单击新生物时,我想在事件处理函数中更改此变量的值;我还想在生物死亡时更改其值,这发生在其自身功能的不同代码块中。
我知道可以使用“全局”关键字来执行此操作,但我的印象是这样做通常是不明智的做法。我也知道我可以将这些变量存储在单独的模块中并导入它们,但是当我处理30多个变量时,每次我想修改它们时都键入“ module_name.variable_name”似乎不必要地乏味。我还考虑将所有这些值存储在全局字典中,以便可以在函数中对其进行修改,但是再次,每次键入“ dict_name ['var_name']”似乎都是不必要的。
因此,本质上我的问题是,在这种情况下,最佳实践是什么?是这些解决方案之一,还是有一种更清洁的方法?我想确保自己在正确的轨道上,然后再花费数小时检查代码。谢谢您的帮助!
答案 0 :(得分:2)
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
变量。 / p>