2

使用下面描述的代码,我可以成功检索存储在 file.cfg 中的属性,但是如何将输出用于其他变量?

from ConfigParser import SafeConfigParser

class Main:

   def get_properties(self, section, *variables):
        cfgFile = 'c:\file.cfg'
        parser = SafeConfigParser()
        parser.read(cfgFile)
        properties= variables
        return {
            variable : parser.get(section,variable) for variable in properties

        }

   def run_me(self):
        config_vars= self.get_properties('database','host','dbname')
        print config_vars

op=Main()
op.run_me()

我仍在学习 Python,但我不确定我需要做什么才能将输出设置为单个变量:

电流输出:

{'host': 'localhost', 'dbname': 'sample'} 

我想拥有什么:

db_host = localhost
db_name = sample
4

2 回答 2

2
def run_me(self):
     config_vars= self.get_properties('database','host','dbname')
     for key, value in config_vars.items():
         print key, "=", value

您收到了 dict-object config_vars,因此您可以使用配置变量作为 dict 的值:

 >>> print config_vars["dbname"]
 sample
 >>> print config_vars["host"]
 localhost

在文档中阅读有关 python 字典的更多信息。

于 2012-10-11T11:51:17.533 回答
1

我会建议这种方法:

import ConfigParser
import inspect

class DBConfig:
    def __init__(self):
        self.host = 'localhost'
        self.dbname = None

    def foo(self): pass

class ConfigProvider:
    def __init__(self, cfg):
        self.cfg = cfg

    def update(self, section, cfg):
        for name, value in inspect.getmembers(cfg):
            if name[0:2] == '__' or inspect.ismethod(value):
                continue

            #print name
            if self.cfg.has_option(section, name):
                setattr(cfg, name, self.cfg.get(section, name))

class Main:
    def __init__(self, dbConfig):
        self.dbConfig = dbConfig

    def run_me(self):
        print('Connecting to %s:%s...' % (self.dbConfig.host, self.dbConfig.dbname))


config = ConfigParser.RawConfigParser()
config.add_section('Demo')
#config.set('Demo', 'host', 'domain.com')
config.set('Demo', 'dbname', 'sample')

configProvider = ConfigProvider(config)

dbConfig = DBConfig()
configProvider.update('Demo', dbConfig)

main = Main(dbConfig)
main.run_me()

这个想法是你在一个类中收集所有重要的属性(你也可以在其中设置默认值)。

然后该方法ConfigProvider.update()将使用配置中的值(如果它们存在)覆盖那些。

obj.name这允许您使用简单的语法访问属性。

要旨

于 2012-10-11T12:13:20.537 回答