2

我有一个使用 ConfigParser 读取配置文件的 python 类:

配置文件:

[geography]
Xmin=6.6
Xmax=18.6
Ymin=36.6
YMax=47.1

Python代码:

class Slicer:
    def __init__(self, config_file_name):
        config = ConfigParser.ConfigParser()
        config.read(config_file_name)
        # Rad the lines from the file
        self.x_min = config.getfloat('geography', 'xmin')
        self.x_max = config.getfloat('geography', 'xmax')
        self.y_min = config.getfloat('geography', 'ymin')
        self.y_max = config.getfloat('geography', 'ymax')

我觉得最后四行是重复的,应该以某种方式压缩为一个 Pythonic 行,该行将self.item为该部分中的每个项目创建一个变量。

有任何想法吗?

亚当

更新:

根据您的回答,我已将代码修改为:

    for item in config.items('geography'):
        setattr(self, '_'+item[0], float(item[1]))

现在,

   print self.__dict__
   >>> {'_xmax': 18.600000000000001, '_ymax': 47.100000000000001, 
        '_ymin': 36.600000000000001, '_xmin': 6.5999999999999996}
4

3 回答 3

5

我通常会尽量避免在构造函数中进行外部交互——这使得测试代码变得困难。最好传递配置解析器实例或类似 fp 的对象而不是文件名。

于 2010-04-11T09:38:34.840 回答
3
for line in ['x_min', 'x_max', 'y_min', 'y_max']:

   setattr(self, line, config.getfloat('geography', line.replace('_', '')))
于 2010-04-11T09:38:38.000 回答
1

怎么样:

对于 ['xmin','xmax','ymin','ymax'] 中的键:
    self.__dict__[key] = config.getfloat('geography',key);

请注意,上面会将其分配给 self.xmin 而不是 self.x_min ...但是,如果您对该命名感到满意,那么这应该可以工作...否则,名称之间的映射将比原始代码更多。

于 2010-04-11T09:37:54.280 回答