Контекст: я использую ruamel.yaml для анализа и управления файлами YAML в Python. Мне нужно сохранить привязки для числовых значений нетронутыми, но вот проблема:
Код: Выделить всё
from ruamel.yaml import YAML, ScalarInt, PlainScalarString
# Custom loader to attempt to preserve anchors for numeric values
class CustomLoader(YAML):
def __init__(self):
super().__init__(typ='rt')
self.preserve_quotes = True
self.explicit_start = True
self.default_flow_style = False
def construct_yaml_int(self, node):
value = super().construct_yaml_int(node)
if node.anchor:
# Preserve the anchor for numeric values
if value == 0:
return PlainScalarString("0", anchor=node.anchor.value)
else:
return ScalarInt(value, anchor=node.anchor.value)
return value
yaml = CustomLoader()
# Load the YAML file
with open('current.yaml', 'r') as current_file:
current_data = yaml.load(current_file)
print("Debug: current_data after load:", current_data)
for key, value in current_data.items():
print(f"Debug: Key '{key}', value type: {type(value)}, has anchor: {hasattr(value, 'anchor')}, anchor value: {getattr(value, 'anchor', None)}")
Код: Выделить всё
current.yamlКод: Выделить всё
person: &person_age 0
person: &person_age 1 #this work`
Фактическое поведение: привязка не сохранился; hasattr(value, 'anchor') возвращает False, а типом значения является , а не ScalarInt или PlainScalarString с привязкой .
Что я пробовал: я пытался переопределить конструктив_yaml_int в пользовательском загрузчике, чтобы вручную сохранять привязки для целых чисел, но, похоже, это не работает. Я убедился, что ruamel.yaml настроен с помощью typ='rt' для двустороннего сохранения. Я экспериментировал с цитированием 0 в файле YAML (person: &person_age "0"), что сохраняет привязку, но это неприемлемое решение для моего варианта использования, когда пользователи могут не цитировать свои числовые значения. значения.
Вопрос: Как обеспечить сохранение привязок для числового значения 0 при использовании ruamel.yaml? Есть ли способ заставить ruamel.yaml обрабатывать привязки чисел без необходимости их цитирования в исходном YAML?
Будем очень признательны за любые идеи или альтернативные подходы.
Версия — [Python:3.12.5, ruamel.yaml:0.18.6]
Подробнее здесь: https://stackoverflow.com/questions/793 ... uamel-yaml
Мобильная версия