【发布时间】:2024-01-17 21:33:02
【问题描述】:
所以我有这门课:
import yaml
class Config():
def __init__(self, filename):
self.config_filename=filename
def __read_config_file(self):
with open(self.config_filename) as f:
self.cfg = yaml.safe_load(f)
def get(self):
self.__read_config_file()
return self.cfg
而且效果很好。它背后的想法是每次我在配置中使用某些东西时都强制重新读取配置文件。下面是一个使用示例:
cfg = Config('myconfig.yaml')
for name in cfg.get()['persons']:
print (cfg.get()['persons'][name]['phone'])
print (cfg.get()['persons'][name]['address'])
这可行,但我认为它看起来非常难看。我可以这样做:
c = cfg.get()['persons']
for name in c:
print (c['persons'][name]['phone'])
print (c['persons'][name]['address'])
这看起来稍微好一点,但我也失去了在访问时重新加载的好处,但我想做的是这样的事情(这显然不起作用):
for name in c:
print (name['phone'])
print (name['address'])
这似乎是我不了解迭代字典的问题,但我主要关心的是,每次使用该文件中的任何值时我都想重新加载配置文件,并且我希望它具有良好的可读性大大地。那么我该如何重新设计呢?
配置文件示例。如有必要,可以在此处更改格式。
persons:
john:
address: "street A"
phone: "123"
george:
address: "street B"
phone: "456"
【问题讨论】:
-
YAML 文件是什么样的?
-
@RoadRunner 这真的重要吗?但是好的,我会更新问题。
-
看看这里,这可能会有所帮助:*.com/questions/35968189/…
-
@klutt 好吧,最好包含一个示例文件。一些未来的读者可能不太习惯使用 YAML 来理解您的代码在做什么。
-
我会让 Config 类成为 UserDict 的子类,然后覆盖
__getitem__()以在返回值之前进行读取 ..
标签: python python-3.x yaml pyyaml