Geben Sie Platzhalterwerte mit Formatierung zurück, wenn ein Schlüssel nicht gefunden wird
Posted: 30 Dec 2024, 18:52
Ich möchte KeyErrors stillschweigend ignorieren und sie stattdessen durch Platzhalter ersetzen, wenn keine Werte gefunden werden. Zum Beispiel:
Mein Ziel dabei ist, dass ich versuche, ein benutzerdefiniertes Lokalisierungspaket für persönliche Projekte zu erstellen (ich konnte keine vorhandenen finden, die alles konnten, was ich wollte). Nachrichten wären vom Benutzer anpassbar, aber ich möchte, dass die Benutzer ein einwandfreies Erlebnis haben. Wenn sie also beispielsweise einen Tippfehler machen und {nmae} anstelle von {name} einfügen, möchte ich das nicht Benutzer müssen sich mit Fehlern auseinandersetzen, aber ich möchte ihnen stattdessen signalisieren, dass sie einen Tippfehler gemacht haben, indem ich ihnen den Platzhalterwert gebe.
Ich habe mehrere Lösungen für Stackoverflow gefunden, aber keine davon kann mit Attributen umgehen. Meine erste Lösung war diese:
Dies führt jedoch zu einem Fehler, wenn versucht wird, es mit Attributen zu verwenden: AttributeError: 'str' object has no attribute 'capitalized', es gibt „Hallo, {name }!" ohne Probleme. Das Gleiche gilt für meine zweite Lösung mit string.Formatter:
Wie könnte ich so etwas erreichen?
Code: Select all
class Name:
def __init__(self, name):
self.name = name
self.capitalized = name.capitalize()
def __str__(self):
return self.name
"hello, {name}!".format(name=Name("bob")) # hello, bob!
"greetings, {name.capitalized}!".format(name=Name("bob")) # greetings, Bob!
# but, if no name kwarg is given...
"hello, {name}!".format(age=34) # hello, {name}!
"greetings, {name.capitalized}!".format(age=34) # greetings, {name.capitalized}!
Ich habe mehrere Lösungen für Stackoverflow gefunden, aber keine davon kann mit Attributen umgehen. Meine erste Lösung war diese:
Code: Select all
class Default(dict):
"""A dictionary that returns the key itself wrapped in curly braces if the key is not found."""
def __missing__(self, key: str) -> str:
return f"{{{key}}}"
Code: Select all
class CustomFormatter(string.Formatter):
def get_value(self, key, args, kwargs):
try:
value = super().get_value(key, args, kwargs)
except KeyError:
value = f'{{{key}}}'
except AttributeError:
value = f'{{{key}}}'
return value
formatter.format("hello, {name}!", name=Name("bob")) # hello, bob!
formatter.format("greetings, {name.capitalized}!", name=Name("bob")) # greetings, Bob!
formatter.format("hello, {name}!", age=42) # hello, {name}!
formatter.format("greetings, {name.capitalized}!", age=42) # AttributeError: 'str' object has no attribute 'capitalized'
Code: Select all
"hello, {name}!".format(name=Name("bob")) # hello, bob!
"greetings, {name.capitalized}!".format(name=Name("bob")) # greetings, Bob!
# but, if no name kwarg is given...
"hello, {name}!".format(age=34) # hello, {name}!
"greetings, {name.capitalized}!".format(age=34) # greetings, {name.capitalized}!