我对Python有点新(但完全没有编程,已经流利地在Perl,PHP,& Ruby中)。 我遇到了所有以前的语言和Python之间的主要区别:主要是我可以轻松地将数据从另一个文件读入整个项目。 这里有两个主要的例子,我想解决:整个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
位于需要数据库类的每个文件的顶部。我宁愿增加:
任何帮助将非常感激。 我已经做了大量的搜索和SO搜索,没有找到我的答案。希望你们中的一个能够帮助你。
谢谢。
更新: 我这样做的原因(对于#2)是因为我也试图让其他类继承数据库类。 所以lib/project/databases/sqlite.py是数据库类的定义。 所以是lib/project/databases/mysql.py。 的想法是,这个导入完成后我可以导入类,如用户类,并定义它像这样:
class user(database):
...
并由此继承了所有的结构和数据库类的方法。 你的建议是简单地创建一个基于sqlite/mysql逻辑/决策的实例,然后将它传递到需要的地方,这是一个很好的解决方案。但我需要更多... 想法?
模块在每次导入时都不会执行。第一次导入的结果保存在一个'sys.modules'字典中。在随后导入同一模块时,缓存的值将被简单地返回而不是再次运行。这意味着,如果您读取模块主代码中的配置文件并将结果保存在全局模块变量中,则只会发生一次。给定模块的所有导入器都可以简单地引用变量及其结果(或模块函数)。 – martineau 2015-01-04 11:55:01
Thanks @maartineau,要清楚:这是否意味着我仍然需要导入每个需要它的文件的配置文件(了解到它实际上并未每次都进行REparsed)?如果我必须在每个文件上导入,这似乎不是什么大问题,只是看起来过分。在完成顶层文件的导入之后,我们很想在每个页面上执行诸如config.settings ['path']之类的操作。 – loqqi 2015-01-04 12:13:08
如果你导入了'config',那么你应该可以引用'config.settings ['path']'假设在运行模块的顶层时定义了一个settings字典(这很容易去做)。你可以让事情看起来像内置的 - 所以'import'甚至不需要 - 但是这样做是不鼓励的。 – martineau 2015-01-04 12:31:56