我已经创建了一个类似.in I的文件,其中包含稍后在程序中需要的所有值,请参见以下内容:
[debugging]
checkForAbort = 10
...
[official]
checkForAbort = 30
...
我希望将所有这些项读入一个类中,并使其可以从python项目的其他部分访问。 到目前为止,我的代码如下:
from ConfigParser import SafeConfigParser
import glob
class ConfigurationParameters
def __init__(self):
self.checkForAbortDuringIdleTime = None
parser = SafeConfigParser()
# making a list here in case we have multiple files in the future!
candidatesConfiguration = ['my.cfg']
foundCandidates = parser.read(candidatesConfiguration)
missingCandidates = set(candidatesConfiguration) - set(found)
if foundCandidates:
print 'Found config files:', sorted(found)
else
print 'Missing files :', sorted(missing)
print "aborting..."
# check for mandatory sections below
for candidateSections in ['official', 'debugging']:
if not parser.has_section(candidateSections)
print "the mandatory section", candidateSections " is missing"
print "aborting..."
for sectionName in ['official', 'debugging']:
for name, value in parser.items(section_name):
self.name = value
我是python新手,但我仍然可以看到我的代码有很多问题:
我该怎么解决这个问题呢?类属性可以动态创建吗?
我的类只需要读取值,所以不需要写入配置文件!
self.name = value
并不像您所期望的那样工作。您的意思可能是setattr(self, name, value)
它动态地创建实例属性。要使其成为单例,可以将实例设置为
config
/settings
模块中的全局变量。在程序启动时初始化一次,例如,logging
模块为根日志程序执行此操作:logging.config.fileConfig('logging.conf')
。通常希望对本质上是dict的内容使用属性访问,例如携带命令行选项的
argparse.Namespace
。您可以稍后通过导入配置来访问它:
from mypackage.config import config
,例如,mypackage/config.py
:在
mypackage/__main__.py
中:注意:
setattr()
即使您设置了属性也可以正常工作。__dict__.update()
这种情况下的中断:What J.F. Sebastian said.
而且,你也可以这样做like Alex Martelli does in his Bunch class:
文件
MyConfig.py
:文件
foo.py
:文件
MyProgram.py
:Python Language Reference声明“Import语句分两步执行:(1)找到一个模块,必要时对其进行初始化;(2)在本地命名空间(Import语句发生的作用域)中定义一个或多个名称。”
这意味着,当一个模块被导入时,一个或多个本地名称被绑定到一个模块对象,并且只有在Python程序运行期间第一次导入时,它才被初始化(即从文件读取并运行)。
在上面的代码中,名称
config
只是引用模块对象的属性的本地名称。模块对象在MyProgram
中被引用时(通过from MyConfig import config
)已由Python解释器初始化。当MyProgram
导入foo
时,它已经初始化并绑定到模块foo
和MyProgram
中的本地名称,我们可以将其称为foo.config
。但这两个名称都指的是非常相同的对象。由pillmuncher给出的答案非常有用,并且可以很容易地适应在现有类中使用。此外,还可以使用localconfig模块(link)自动转换数据类型。要获得这些附加功能,您可以使用以下内容:
相关问题 更多 >
编程相关推荐