当前位置: 首页 > 面试题库 >

使用ConfigParser创建具有文件中指定的所有元素的类

凤昊东
2023-03-14
问题内容

我创建了一个类似.ini的文件,其中包含稍后在程序中需要的所有值,请参见下文:

[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的新手,但是我的代码仍然可以看到很多问题:

  • 我被迫在班级文件中为每个项目添加一个属性。并始终保持配置文件和我的班级同步。
  • 此类不是单例,因此无论从何处导入都将进行读取/解析!
  • 如果在我的课程中未将值添加到配置文件中,则可能会崩溃!

我应该如何解决这个问题呢?可以动态创建类属性吗?

我的班级只需要从这些值中读取数据,因此无需写入配置文件!


问题答案:

另外,您可以像AlexMartelli在Bunch班上那样:

文件MyConfig.py

from ConfigParser import SafeConfigParser


section_names = 'official', 'debugging'


class MyConfiguration(object):

    def __init__(self, *file_names):
        parser = SafeConfigParser()
        parser.optionxform = str  # make option names case sensitive
        found = parser.read(file_names)
        if not found:
            raise ValueError('No config file found!')
        for name in section_names:
            self.__dict__.update(parser.items(name))  # <-- here the magic happens


config = MyConfiguration('my.cfg', 'other.cfg')

文件foo.py

from MyConfig import config
# ...

文件MyProgram.py

from MyConfig import config

print config.checkForAbort

import foo

assert config is foo.config

《Python语言参考》指出:
“导入语句分两步执行:(1)找到一个模块,并在必要时对其进行初始化;(2)在本地名称空间中定义一个(或多个)名称(在该范围内使用import语句)”
。”

这意味着,当导入模块时,一个或多个本地名称绑定到模块对象,并且只有在Python程序运行时才首次导入该模块时,它才会初始化(即从文件中读取并运行) 。

在上面的代码中,名称config只是引用模块对象属性的本地名称。在中通过引用(通过from MyConfig importconfig)时,Python解释器已初始化了模块对象MyProgram。当MyProgram进口foo它已经被初始化和被绑定到本地名称模块fooMyProgram我们可以称其为foo.config。但是,这两个名称都指向_同一_ 对象。



 类似资料:
  • 我有一个HTML,比如, 这里有两个“tel”类元素,如何提取这两个元素?如果程序不知道这些名为“tel”的类的数量,如何提取?请帮忙。 最终目标是获取tel类元素中的所有文本。 我已经试着用下一个兄弟元素来解决这个问题。但是那里没有运气。不过我可能试错了。请纠正我或帮助我实现我在这里尝试的目标。 提前谢谢。

  • 问题内容: 如何使用jQuery选择应用了特定CSS属性的所有元素?例如: 如何通过名为“四舍五入”的属性进行选择? CSS类名非常灵活。 如何将这两个操作替换为一个操作。也许是这样的: 有什么更好的方法吗? 问题答案: 您不能(使用CSS选择器)根据已应用于它们的CSS属性来选择元素。 如果您想手动执行此操作,则可以选择文档中的每个元素,在它们上循环,然后检查您感兴趣的属性的计算值(尽管这可能仅

  • 显示所有指定的元素。 使用展开运算符 (...) 和 Array.forEach() 来清除每个指定元素的 display 属性。 const show = (...el) => [...el].forEach(e => (e.style.display = '')); show(...document.querySelectorAll('img')); // Shows all <img> e

  • 隐藏所有指定的元素。 使用展开运算符(...)和 Array.forEach() 将 display: none 应用于每个指定的元素。 const hide = (...el) => [...el].forEach(e => (e.style.display = 'none')); hide(...document.querySelectorAll('img')); // Hides all

  • 问题内容: 有没有一种 有效的 方法来用Java创建具有给定大小的文件? 在C语言中,可以使用ftruncate来完成。 大多数人只会将 n个 虚拟字节写入文件,但是必须有一种更快的方法。我在考虑ftruncate以及稀疏文件 … 问题答案: 创建一个新的RandomAccessFile并调用setLength方法,指定所需的文件长度。底层JRE实现应使用您环境中可用的最有效方法。 以下程序 在L

  • 问题内容: 使用JavaScript在具有特定CSS类的html文档中获取所有元素的数组的最佳方法是什么? 目前没有像jQuery这样的JavaScript框架现在允许在这里使用,我可以循环所有元素并亲自检查它们。我希望有一些优雅的东西。 问题答案: 它的值得指出的对于原生浏览器支持已经得到了_很多_更好。但是,如果您必须支持旧版浏览器,那么… 使用已经写好的一个。大多数主要的JS库都以某种形式包