如何在Python模块中公开变量?

时间:2013-06-28 03:45:58

标签: python

从模块公开变量的最佳方法是什么?

import otherDBInterface as odbi

def create(host):
    global connection
    global cursor
    connection = odbi.connect(host)
    cursor = connection.cursor()
    ...

我想在模块中公开cursor变量,以便我可以执行mydb.cursor.execute("select * from foo;")之类的操作。我认为使用global关键字会这样做,但没有这样的运气。 cursor是一个对象,所以我不确定如何声明它以便暴露它。

2 个答案:

答案 0 :(得分:4)

您可以将连接信息包装在类

class Database:

    def __init__(self, **kwargs):

        if kwargs.get("connection") is not None:

            self.connection = kwargs["connection"]

        elif kwargs.get("host") is not None:

            self.connection = odbi.connect(host)
            self.cursor = self.connection.cursor()

mydb = Database(host="localhost")

results = mydb.cursor.execute("select * from foo")

#or use it with a connection

mydb = Database(connection="localhost")

results = mydb.cursor.execute("select * from foo")

答案 1 :(得分:1)

默认情况下,在模块级别创建的任何变量都是“公开”的。

因此,像这样的模块将有三个公开的变量:

configpath = '$HOME/.config'

class Configuration(object):

    def __init__(self, configpath):
        self.configfile = open(configpath, 'rb')

config = Configuration(configpath)

变量为configpathConfigurationconfig。所有这些都可以从其他模块导入。您还可以config访问configfile config.configfile

您也可以通过以下方式访问configfile:

configpath = '$HOME/.config'
configfile = None

class Configuration(object):

    def __init__(self, configpath):
        global configfile
        configfile = open(configpath, 'rb')

config = Configuration(configpath)

但是这有很多棘手的问题,好像你从另一个模块获得了configfile的句柄,然后它从Configuration内被替换,你的原始句柄不会改变。因此,这仅适用于可变对象。

在上面的示例中,这意味着以这种方式使用configfile作为全局将不会非常有用。但是,使用config就可以了。