给定一个 Windows ini 风格的配置文件,例如“airplanes.ini”:
[JumboJet]
wingspan = 211
length = 231
seating = 416
crew = 2
unit_cost = 234000000
on_hand = 3
[SopwithCamel]
wingspan = 28
length = 18
armament = twin Vickers
crew = 1
on_hand = 1
[NCC1701]
length = 289 meters
crew = 430
speed = Warp 8
armament = 12 phasers, 6 photon torpedo
我使用 Python 2.7.3 库中的 ConfigParser 模块来读取文件的内容,然后使用内置type()
函数为配置文件中的每个 [section] 创建一个类型为“Airplane”的新对象。每name = value
对都成为对象的一个属性:
# create a config parser, using SafeConfigParser for variable substitution
config = ConfigParser.SafeConfigParser()
# read in the config file
config.read('airplanes.ini')
airplanes = []
# loop through each "[section]" of config file
for section in config.sections():
# create a new object of type Airplane
plane = type("Airplane",(object,),{"name":section})
# loop through name = value pairs in section
for name, value in config.items(section)
# this is where the magic happens?
setattr(plane, name, lambda: config.set(section,name,value))
airplanes.append(plane)
# do stuff with Airplanes,
boeing = airplanes[1]
# this update needs to call through to config.set()
boeing.on_hand = 2
# then save the changes out to the config file on disk
with open('airplanes.ini','wb') as f:
config.write(f)
注释“这就是魔法发生的地方”的行表示我想set()
通过属性的“setter”设置对 ConfigParser 方法的调用以更新配置对象。我相信setattr(plane, name, value)
这是创建属性的“通常”方式,但这不会调用config.set()
.
我希望灵活地将对象的属性动态定义为配置文件每个部分中的项目,即使每个部分中的项目不同,或者每个部分有不同数量的项目。
关于如何实现这一点的任何建议?我不认为 property() 或 setattr() 会做我想做的事。