从模块公开变量的最佳方法是什么?
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
是一个对象,所以我不确定如何声明它以便暴露它。
答案 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)
变量为configpath
,Configuration
和config
。所有这些都可以从其他模块导入。您还可以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
就可以了。