Python:在模块之间传递对象的正确方法

时间:2013-12-29 19:06:00

标签: python module

我关注的是Flask SQLalchemy Quickstart,其中包含单个文件中的所有代码:

这是我的初始 index.py

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)

# [snip] - some classes related to SQLAlchemy are here 

if __name__ == '__main__':
    app.run(host='0.0.0.0')

我想稍微拆分代码,所以我创建了一个名为 database.py 的单独文件,它将包含所有与数据库相关的代码,并作为模块导入。

我将 index.py 修改为如下所示:

from flask import Flask

# Import my database module
import database

app = Flask(__name__)

if __name__ == '__main__':
    app.run(host='0.0.0.0')

文件 database.py

from flask.ext.sqlalchemy import SQLAlchemy

app.config['SQLALCHEMY_DATABASE_URI]'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)

# [snip] - some classes related to SQLAlchemy are here 

显然,当我尝试运行此代码时,出现以下错误:

File "database.py", line 5, in <module>
    app.config['SQLALCHEMY_DATABASE_URI]'] = 'sqlite:////tmp/test.db'
NameError: name 'app' is not defined

我可以看到这是因为app对象只存在于父模块中。

我可以将以下几行放回 index.py

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)

但是这会产生类似的问题,因为db在database.py文件中不可用。

对此进行编码的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

您可以通过输入:

将对象app导入database.py
from index import app
database.py中的

答案 1 :(得分:0)

评论后编辑回答:

只需使用

from index import app

在database.py。

或者,使用

import index

声明,仅使用index.app而不是app

这可以帮助你摆脱python的导入地狱。

顺便说一句:不确定您使用的是哪个IDE。我非常喜欢pycharm。使用它可以重构代码,并自动阻止上述问题。