如何在python中使用'global'变量?

时间:2015-08-19 13:08:57

标签: python global-variables

在我的问题中,我有一个由用户启动的python代码,如:

# file main.py
import sys
import mymodule
config = sys.argv[1]

导入另一个包含函数,类等的模块,如

# module.py
def check_config():
    # do something with the content of 'config'
class Module(object):
    # does something with the content of 'config'

如何从module.py中访问'config'的值?我应该在这里使用'全球'变量吗?或者是否有更复杂的pythonic方法来解决这个问题?

另外,我不想为我在其他模块中使用的每个函数和类定义一个参数'config'...

进一步说明:main.py导入其他模块,而不是相反......

4 个答案:

答案 0 :(得分:3)

您应该将global作为参数传递,而不是试图与config进行争吵。

文件main.py

import sys
import mymodule
config = sys.argv[1]

checked = mymodule.check_config(config)
mod = mymodule.Module(config)

module.py

def check_config(config):
    # do something with the content of 'config'
class Module(object):
    # does something with the content of 'config'
    def __init__(self, config):
        # initialise with config

尽可能避免使用global。如果您需要修改config,只需让模块函数返回它。

config = change_config(config)

module.py

def change_config(config):
    ...
    return config

但是,另一种方法是在module.py中定义一个值,该值将存储默认情况下不保留任何内容的信息。然后,只要file main.py导入module.py并且配置数据准备就绪,您就可以将数据分配给module.py的配置名称。像这样:

文件main.py

import sys
import mymodule
config = sys.argv[1]

mymodule.config = config

mymodule.test_config()
mymodule.check_config()
mymodule.Module()

module.py

config = None

def test_config():
    print config 
    # this will refer to the value supplied from file main.py

但请注意,模块和主文件中的值不会连接。如果由于任何原因在file main.py中重新分配配置,则必须再次将该值传递给模块。但是,如果您传递可变值(如dict或list),则可以在file main.py中修改它,并且值将被共享。

答案 1 :(得分:2)

我不建议使用全局变量,但如果你这样做,那么你应该使用这个设计。需要在config中定义mymodule;导入模块后,您可以按照当前设置mymodule.config的方式设置config的值。

# file main.py
import sys
import mymodule
mymodule.config = sys.argv[1]


# module.py
# The exact value doesn't matter, as long as we create the name.
# None is good as it conveys the lack of a value; it's part of your
# module's contract, presumably, that a proper value must be assigned
# before you can use the rest of the module.
config = None
def check_config():
    # do something with the content of 'config'
class Module(object):
    # does something with the content of 'config'

答案 2 :(得分:1)

全局变量几乎永远不是答案。只需允许“库”(module.pymymodule.py中的函数和类,您似乎同时使用它们)来接受参数。所以:

<强> mymodule.py

def check_config(configuration):
    pass

class Module(object):
    def __init__(self, configuration):
        self.config = configuration

class ConfigError(Exception):
    pass

然后,当您想在“应用程序”代码中使用它们时:

<强> main.py

import sys
import mymodule

config = sys.argv[1]

if mymodule.check_config(config):
    myobject = mymodule.Module(config)
else:
    raise mymodule.ConfigError('Unrecognized configuration format.')

答案 3 :(得分:0)

你能描述一下你的app应该做什么吗?因为现在还不清楚,为什么你想要它。 也许环境变量可以帮到你?

顺便说一句,你可以在一个地方(模块)阅读配置文件,并从中导入你需要的所有东西。

<强> config.py

   import os
   if os.environ['sys'] == 'load_1':
        import load_1 as load
        i = 12
   else:
        import load_2 as load
        i = 13

<强> main.py

   import config

   config.load("some_data")
   print config.i