core icon indicating copy to clipboard operation
core copied to clipboard

quirky ocrd_utils.config implementation, esp. for variables without default

Open bertsky opened this issue 5 months ago • 1 comments

(Posting this in German to re-use a chat...)

OcrdEnvConfig ist sehr seltsam definiert:

Nehmen wir eine Variable, die keinen Default hat, z.B. OCRD_METS_CACHING:

Der Versuch einer Referenzierung (config.OCRD_METS_CACHING) ergibt eine Exception: KeyError. Na ok, ich soll also immer erst mal config.is_set benutzen?

Dann setzen wir doch mal config.OCRD_METS_CACHING = True. Jetzt hat sie einen Wert (vom Typ bool). Das hat das builtin setattr nämlich gesetzt. Die Abfrage geschieht aber nicht per überschriebenem __getattr__ – sondern builtin getattr greift zuvor den Wert ab. Schön – ist mir eigentlich egal.

Aber: config.is_set('OCRD_METS_CACHING') liefert immer noch False! Denn in os.environ hat sich ja nichts getan.

Ich kann mich also auch nicht auf config.is_set verlassen. Wenn sie jemand gesetzt hat, kann ich sie direkt abrufen, wenn nicht bekomme ich eine Exception.

(Bei Variablen mit Defaults ist es übrigens etwas logischer, aber auch dort funktioniert is_set nicht, und os.environ wird von programmatischen Zuweisungen ebenfalls nicht berührt.)

bertsky avatar Jul 11 '25 12:07 bertsky

Mir würde vorschweben, einfach __setattr__ zu überschreiben, indem ich dort auch os.environ aktualisiere...

Als Alternative könnte man auch die ganze os.environ-Kiste zum Zeitpunkt der Modul-Initialisierung verlegen, also bereits geparste und validierte (statt rohen) Werten ablegen. Zur Laufzeit hat man dann nichts mehr mit os.environ zu tun (was auch die Isolierung für die Tests verbessert...)

bertsky avatar Jul 11 '25 12:07 bertsky