首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python子类ConfigParser

Python子类ConfigParser
EN

Code Review用户
提问于 2011-06-02 02:20:10
回答 1查看 4K关注 0票数 3

我以前从来没有做过这样的事情,所以我希望其他人在我太兴奋之前看一看这个:)

我是不是让事情变得更复杂了?我试图让这个系统上的其他模块/脚本更容易地存储和检索它们的设置。因此,为什么我捕获ConfigParser.NoOptionError错误并返回None,如果set()方法中不存在该部分,则创建该部分。

有什么建议吗?

代码语言:javascript
复制
import ConfigParser
import os

from ast import literal_eval as Eval

class _ConfParse(ConfigParser.ConfigParser):
    def __init__(self, confpath, conffile):
        ConfigParser.ConfigParser.__init__(self)
        self.conf_file = os.path.join(confpath, conffile)
        try: self.readfp(open(self.conf_file), 'r')
        except IOError as Err:
            if Err.errno == 2: pass
            else: raise Err

    def set(self, section, option, value):
        if self.has_section(section):
            ConfigParser.ConfigParser.set(self, section, option, str(value))
        else:
            self.add_section(section)
            ConfigParser.ConfigParser.set(self, section, option, str(value))

    def get(self, section, option):
        try: return Eval(ConfigParser.ConfigParser.get(self, section, option))
        except ConfigParser.NoOptionError: return None

    def save(self):
        self.write(open(self.conf_file, 'w'))

    def __del__(self):
        self.save()

class LocalConfig(_ConfParse):
    def __init__(self, conffile, confpath = '/etc/local/cnf'):
        _ConfParse.__init__(self, confpath, conffile)

class SysConfig(_ConfParse):
    def __init__(self, conffile, confpath = '/etc/sys/cnf'):
        _ConfParse.__init__(self, confpath, conffile)
EN

回答 1

Code Review用户

回答已采纳

发布于 2011-06-03 20:38:17

我看到的一个问题是,从修改的get()方法返回None与无值选项(从ConfigParser的模块文档底部)的正常情况相冲突:

代码语言:javascript
复制
>>> import ConfigParser
>>> import io

>>> sample_config = """
... [mysqld]
... user = mysql
... pid-file = /var/run/mysqld/mysqld.pid
... skip-external-locking
... old_passwords = 1
... skip-bdb
... skip-innodb
... """
>>> config = ConfigParser.RawConfigParser(allow_no_value=True)
>>> config.readfp(io.BytesIO(sample_config))

>>> # Settings with values are treated as before:
>>> config.get("mysqld", "user")
'mysql'

>>> # Settings without values provide None:
>>> config.get("mysqld", "skip-bdb")

>>> # Settings which aren't specified still raise an error:
>>> config.get("mysqld", "does-not-exist")
Traceback (most recent call last):
  ...
ConfigParser.NoOptionError: No option 'does-not-exist' in section: 'mysqld'

注意,第二个例子被注释为“无值设置”:当然,如果您打算排除这类选项,这不是一个问题。除此之外,我喜欢汽车部分的功能。

不过,我倾向于向接口添加,而不是屏蔽和更改行为,因此,与其替换get/set,不如添加safe_版本:

代码语言:javascript
复制
def safe_set(self, section, option, value):
    if self.has_section(section):
        self.set(section, option, str(value))
    else:
        self.add_section(section)
        self.set(section, option, str(value))

def safe_get(self, section, option):
    if self.has_option(section, option):
        return self.get(section, option)
    else:
        return None

这将使它更加灵活,因为代码仍然可以访问ConfigParser的正常接口,并且可以选择使用不引发异常的“安全”调用。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/2775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档