Сохранение привязки для числового значения 0 в ruamel.yamlPython

Программы на Python
Ответить
Anonymous
 Сохранение привязки для числового значения 0 в ruamel.yaml

Сообщение Anonymous »

Я столкнулся с проблемой сохранения привязок YAML для числовых значений, особенно с числом 0, все остальные числовые значения работают нормально при использовании ruamel.yaml. Вот что происходит:
Контекст: я использую 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`
Ожидаемое поведение: привязка &person_age должна быть сохранена для ключа человека со значением 0.
Фактическое поведение: привязка не сохранился; 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»