我对Python有点新手(但根本没有编程,已经熟练掌握了Perl,PHP和Ruby)。 我在以前的所有语言和Python之间遇到了很大的不同:主要是我可以轻松地将数据从另一个文件读入整个项目。 我想解决两个主要的例子:
1)我想有一个设置/配置文件(在YAML中),它被读入并在config.py文件中解析。然后我希望生成的dict()可以被项目中的所有其他文件访问。我已经想出了如何通过from lib.project.config import cfg
执行此操作,但这意味着对于导入配置的每个页面,系统必须重新分析yaml。这对我来说似乎很愚蠢。有没有办法只解析一次该文件,然后让我的项目中的任何其他文件都可以访问结果?
2)我想导入一个database.py文件然后查看我的配置,看看我们是否需要导入数据库类的sqlite3,mysql或postgresql版本。同样,我可以通过将逻辑直接放在我需要数据库类的每个页面中来管理它。但我讨厌必须粘贴像
这样的代码if cfg.get('db_type') == 'sqlite':
from lib.project.databases.sqlite3 import database
elif cfg.get('db_type') == 'mysql':
from lib.project.databases.mysql import database
位于需要数据库类的每个文件的顶部。我更愿意添加:
import lib.project.database
非常感谢任何帮助。 我已经做了大量的谷歌搜索和SO搜索,但没有找到我的答案。希望你们中的一位能够帮助你们。
感谢。
更新: 我这样做的原因(对于#2)是因为我也试图让其他类继承数据库类。 所以lib / project / databases / sqlite.py是数据库类的定义。 lib / project / databases / mysql.py也是如此。 我的想法是,在导入完成后,我可以导入类似用户类的类,并按如下方式定义它:
class user(database):
...
因此继承了数据库类的所有结构和方法。 你的建议是简单地创建一个基于sqlite / mysql逻辑/决策的实例,然后传递它需要的地方是一个很好的解决方案。但我还需要更多...... 想法?
答案 0 :(得分:1)
1)您已全部设置 - 该文件只能读取一次。
2)同意你不想复制任何粘贴代码 - 如果你想在整个项目中使用1个数据库实例,你可以这样做:
import lib.project
db = lib.project.database
其中db
只是用于访问已创建数据库的局部变量。您可以将数据库实例化为database
(使用if/elif
代码解析,是否使用sqlite3或mysql)lib/project/databases.py
然后在lib/project/__init__.py
中文件你会做from .databases import database
。
如果你想在整个项目中使用多个数据库(相同的sqlite3 / mysql类型),你将解决Database
中绑定(或继承自)的构造函数databases.py
:
from lib.project.Config import config
if config.db_type == 'sqlite' :
import lib.project.databases.Sqlite as Db
elif config.db_type == 'mysql':
import lib.project.databases.Mysql as Db
class Database(Db):
'''docs'''
答案 1 :(得分:1)
感谢大家帮助我们了解有关Python的更多信息,以及如何获得我正在寻找的内容。
这是我最终做的事情:
1)配置文件问题: 这显然主要是从一开始就解决了。我确认了每个人都说的话:你可以"导入"一个文件尽可能多次,但它只被解析/处理/编译一次。至于使它可以访问任何需要它的文件: 配置类:
import os
import yaml
class Config:
def __init__(self):
self.path = os.getcwd()
stream = open(self.path+"/conf/config.yaml", 'r')
data = yaml.load(stream)
config_keys = data.keys()
for k in config_keys:
setattr(self, k, data.get(k))
if (os.path.isfile(self.path+"/conf/config-override.yaml") ):
stream = open(self.path+"/conf/config-override.yaml", 'r')
data = yaml.load(stream)
config_keys = data.keys()
for k in config_keys:
setattr(self, k, data.get(k))
config = Config()
然后任何想要使用它的文件:
from lib.project.Config import config
到目前为止,这一切都在游泳。
2)Database类的动态数据库类型: 我只是改变了我的整体设计,使得一个Database类(大部分是空的)继承自Sqlite或Mysql类(两个自定义构建都是现有Sqlite3和mysql-connector类的包装)。这种方式总是有一个可靠的数据库类继承,我只加载我需要的文件,它全部由我的配置文件定义。例: 数据库类:
from lib.project.Config import config
if config.db_type == 'sqlite' :
from lib.project.databases.Sqlite import Sqlite
elif config.db_type == 'mysql':
from lib.project.databases.Mysql import Mysql
class Database(Sqlite if config.db_type == 'sqlite' else Mysql):
''' documentation '''
我仍然希望听到人们对此代码/方法的反馈。 正如我所说,我仍然对Python很新,但仍然可能会遗漏一些东西。
再次感谢大家。