gpt4 book ai didi

python - 在配置文件中使用字典而不是列表是一个坏习惯吗?

转载 作者:行者123 更新时间:2023-12-01 08:23:55 33 4
gpt4 key购买 nike

考虑以下 yaml 配置文件:

items:
item_A:
field_A: some_value
field_B: some_other_value
item_B:
field_A: some_value
field_B: some_other_value

表示这一点的逻辑方法是在每个项目前面添加破折号,使其成为项目列表:

items:
- item_A:
field_A: some_value
field_B: some_other_value
- item_B:
field_A: some_value
field_B: some_other_value

我想轻松访问对象的名称(item_A 等)。

迭代以前的配置时,

for item in items:
print(item) # here, 'item' will be the keys in the items dict (eg. 'item_A')

与后者相比

for item in items:
print(item) # here, 'item' will be a full dict (eg. "item_A":{"field_A":"some_value"..)
# if I want access to the name item_A, I need to do item.keys()[0]- not so friendly

我知道第二种表示形式在逻辑上对于这种情况来说是正确的,但我发现使用第一种表示形式更方便,以便能够迭代并直接获取键/对象名称。

所以,我的问题是:

为了轻松访问项目的名称/键,将列表表示为字典(如提供的示例中所示)是否被认为是一个坏习惯?

执行此操作时是否会出现任何缺点或问题?

最佳答案

什么是坏习惯,什么是合乎逻辑的,都是有争议的。我认为您假设因为根级别映射中的关键 items 是复数,该值由多个项目组成,并且应该是顺序。我认为这不一定是真的。

但是,如果映射中的键值顺序为值对于 items (即带有键 item_Aitem_B 的项目)除了必须使用列表之外,您可能想要这样做:

items:
- name: item_A
field_A: some_value
field_B: some_other_value
- name: item_B
field_A: some_value
field_B: some_other_value

当您将其加载到变量 data 中时,不再可以轻松访问 item_B,就像与你的解决方案。加载后您可以执行的操作是:

data['items'] = Items(data['items'])

使用类 Items 适本地提供对底层的访问通过提供 __getitem____iter__ 的数据结构,以便您可以执行

items = data['items']
for item_name in items:
item = items[item_name]

您可以通过使用标签在加载后无需后处理步骤来做到这一点

items: !Items
- name: item_A
field_A: some_value_1
field_B: some_other_value_1
- name: item_B
field_A: some_value_2
field_B: some_other_value_2

并注册您的类Items。然而,这可能看起来不像用户友好的没有标签的版本,尽管在我看来,在这种情况下,显式比隐式更好。

假设上面是input.yaml:

import sys
from pathlib import Path
import ruamel.yaml

input = Path('input.yaml')

yaml = ruamel.yaml.YAML()

@yaml.register_class
class Items:
def __init__(self, items):
self.item_list = items

@classmethod
def from_yaml(cls, constructor, node):
return cls(constructor.construct_sequence(node, deep=True))

def __getitem__(self, key):
if isinstance(key, int):
return self.item_list[key]
for item in self.item_list:
if item['name'] == key:
return item

def __iter__(self):
for item in self.item_list:
yield item['name']

data = yaml.load(input)
items = data['items']
print('item1', items[1]['field_A'])
print('item2', items['item_A']['field_A'])
for item_name in items:
item = items[item_name]
print('item3', item['field_B'])

给出:

item1 some_value_2
item2 some_value_1
item3 some_other_value_1
item3 some_other_value_2

如果 items 是 YAML 文档根级别的唯一键,那么当然根本不需要那把 key ,那么你应该把你的标签放在文档的开头并有一个序列作为根节点。

关于python - 在配置文件中使用字典而不是列表是一个坏习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54426188/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com