Beibehalten von Ankern für den numerischen Wert 0 in ruamel.yamlPython

Python-Programme
Guest
 Beibehalten von Ankern für den numerischen Wert 0 in ruamel.yaml

Post by Guest »

Ich habe ein Problem mit der Beibehaltung von YAML-Ankern für numerische Werte, insbesondere bei der Zahl 0, bei der Verwendung von ruamel.yaml funktionieren alle anderen numerischen Werte einwandfrei. Folgendes passiert:
Kontext: Ich verwende ruamel.yaml, um YAML-Dateien in Python zu analysieren und zu bearbeiten. Ich muss Anker für numerische Werte intakt halten, aber hier ist das Problem:

Code: Select all

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)}")

Code: Select all

current.yaml
:

Code: Select all

person: &person_age 0
person: &person_age 1 # this works
Erwartetes Verhalten: Der Anker &person_age sollte für den Personenschlüssel mit dem Wert 0 erhalten bleiben.
Tatsächliches Verhalten: Der Anker ist nicht erhalten; hasattr(value, 'anchor') gibt False zurück und der Werttyp ist und nicht ScalarInt oder PlainScalarString mit einem Anker .
Was ich versucht habe: Ich habe versucht, construction_yaml_int in einem benutzerdefinierten Loader zu überschreiben, um Anker für Ganzzahlen manuell beizubehalten, aber es scheint nicht zu funktionieren. Ich habe sichergestellt, dass ruamel.yaml mit typ='rt' für die Round-Trip-Erhaltung konfiguriert ist. Ich habe damit experimentiert, die 0 in der YAML-Datei (person: &person_age "0") in Anführungszeichen zu setzen, wodurch der Anker erhalten bleibt, aber das ist für meinen Anwendungsfall, in dem Benutzer ihre Zahl möglicherweise nicht angeben, keine praktikable Lösung Werte.
Frage: Wie kann ich sicherstellen, dass Anker für den numerischen Wert 0 erhalten bleiben, wenn ich ruamel.yaml verwende? Gibt es eine Möglichkeit, ruamel.yaml zu zwingen, Anker für Zahlen zu verarbeiten, ohne dass diese in der Quell-YAML zitiert werden müssen?
Alle Erkenntnisse oder alternativen Ansätze wären sehr dankbar.
Version- [Python:3.12.5, ruamel.yaml:0.18.6]

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post