Geben Sie Platzhalterwerte mit Formatierung zurück, wenn ein Schlüssel nicht gefunden wirdPython

Python-Programme
Guest
 Geben Sie Platzhalterwerte mit Formatierung zurück, wenn ein Schlüssel nicht gefunden wird

Post by Guest »

Ich möchte KeyErrors stillschweigend ignorieren und sie stattdessen durch Platzhalter ersetzen, wenn keine Werte gefunden werden. Zum Beispiel:

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}!
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:

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

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'
Wie könnte ich so etwas erreichen?

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}!

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post