当只有一个这样的模块时,我将其命名为“ g”。在其中,我为每个打算视为全局变量的变量分配默认值。在每个使用其中任何一个的模块中,我都不使用“ from g import var”,因为这只会导致一个局部变量,这个局部变量仅在导入时从 g 初始化。我使用 g.var 格式进行大多数引用,“ g”常常提醒我正在处理的变量可能会被其他模块访问。
如果要在模块中的某个函数中频繁使用这样一个全局变量的值,那么该函数可以创建一个局部副本: var = g.var。但是,必须认识到,对 var 的赋值是本地的,如果不在赋值中显式引用 g.var,就无法更新全局 g.var。
当 x 还没有在 g 中定义的时候,仍然可以对 g. x 进行赋值,然后一个不同的模块可以访问 g. x。然而,即使解释器允许这样做,这种方法也不是那么透明,我确实避免这样做。由于赋值的变量名中的输入错误,仍然有可能意外地在 g 中创建一个新变量。有时,对 dir (g)的检查有助于发现这种意外事件可能产生的任何令人吃惊的名称。
# in myapp.__init__
Timeouts = {} # cross-modules global mutable variables for testing purpose
Timeouts['WAIT_APP_UP_IN_SECONDS'] = 60
# in myapp.mod1
from myapp import Timeouts
def wait_app_up(project_name, port):
# wait for app until Timeouts['WAIT_APP_UP_IN_SECONDS']
# ...
# in myapp.test.test_mod1
from myapp import Timeouts
def test_wait_app_up_fail(self):
timeout_bak = Timeouts['WAIT_APP_UP_IN_SECONDS']
Timeouts['WAIT_APP_UP_IN_SECONDS'] = 3
with self.assertRaises(hlp.TimeoutException) as cm:
wait_app_up(PROJECT_NAME, PROJECT_PORT)
self.assertEqual("Timeout while waiting for App to start", str(cm.exception))
Timeouts['WAIT_JENKINS_UP_TIMEOUT_IN_SECONDS'] = timeout_bak