Wie bekomme ich Python, um anmutig zu formatieren Keine und nicht existierende Felder

Diese Frage hat hier schon eine Antwort:

  • Leaving Werte leer, wenn nicht in str.format 6 Antworten weitergegeben

Wenn ich in Python schreibe:

  • Matplotlib: Etiketten für kleinere Zecken auch anzeigen
  • Wie ist die Reihenfolge der Artikel in der Matplotlib-Legende bestimmt?
  • Wie benutzt man Twisted, um die Benutzerliste eines IRC-Kanals zu erhalten
  • Django Admin-Funktionalität am Frontend mit Inlines aktivieren
  • Muss ein Element zu Beginn eines Iterators in Python hinzufügen
  • Textverarbeitung und Erkennung aus einem bestimmten Wörterbuch in Python
  • data = {'n': 3, 'k': 3.141594, 'p': {'a': 7, 'b': 8}} print('{n}, {k:.2f}, {p[a]}, {p[b]}'.format(**data)) del data['k'] data['p']['b'] = None print('{n}, {k:.2f}, {p[a]}, {p[b]}'.format(**data)) 

    Ich bekomme:

     3, 3.14, 7, 8 Traceback (most recent call last): File "./funky.py", line 186, in <module> print('{n}, {k:.2f}, {p[a]}, {p[b]}'.format(**data)) KeyError: 'k' 

    Statt einer Fehlermeldung, wie bekomme ich Python, um die Felder "Nicht" und "Nicht vorhanden"

    Um ein Beispiel zu nennen, würde ich gern in der Ausgabe etwas mehr sehen:

     3, 3.14, 7, 8 3, ~, 7, ~ 

    Idealerweise möchte ich natürlich auch die angewendete Zeichenkette anstelle dieser fehlenden Werte angeben.

  • Wie man den Eingabewert von HTML-Formular abruft, wenn das Formular in django für loop ist
  • Internationalisierung von Modellen in Django-Anwendungen
  • So stellen Sie die Projektroot-URL ein, wenn Wagtail als App in einem Django-Projekt integriert ist
  • KeyError beim Indizieren von Pandas dataframe
  • Beispiele für String finden in Python
  • PyQt4 @pyqtSlot: Was ist das Ergebnis kwarg für?
  • 3 Solutions collect form web for “Wie bekomme ich Python, um anmutig zu formatieren Keine und nicht existierende Felder”

    Die Empfehlung in PEP 3101 ist die Unterklasse Formatter :

     import string class PartialFormatter(string.Formatter): def __init__(self, missing='~~', bad_fmt='!!'): self.missing, self.bad_fmt=missing, bad_fmt def get_field(self, field_name, args, kwargs): # Handle a key not found try: val=super(PartialFormatter, self).get_field(field_name, args, kwargs) # Python 3, 'super().get_field(field_name, args, kwargs)' works except (KeyError, AttributeError): val=None,field_name return val def format_field(self, value, spec): # handle an invalid format if value==None: return self.missing try: return super(PartialFormatter, self).format_field(value, spec) except ValueError: if self.bad_fmt is not None: return self.bad_fmt else: raise fmt=PartialFormatter() data = {'n': 3, 'k': 3.141594, 'p': {'a': '7', 'b': 8}} print(fmt.format('{n}, {k:.2f}, {p[a]}, {p[b]}', **data)) # 3, 3.14, 7, 8 del data['k'] data['p']['b'] = None print(fmt.format('{n}, {k:.2f}, {p[a]:.2f}, {p[b]}', **data)) # 3, ~~, !!, ~~ 

    Wie eingerichtet, wird es drucken ~~ wenn ein Feld oder Attribut nicht gefunden wird und !! Wenn bei dem Feldwert ein ungültiges Format verwendet wird. (Verwenden Sie einfach nur für das Keyword-Argument bad_fmt wenn Sie die Voreinstellung eines bad_fmt möchten.)

    Um fehlende Schlüssel zu behandeln, musst du beide get_field , um den KeyError oder AttributeError und format_field zu format_field , um einen Standardwert für den fehlenden Schlüssel zurückzugeben.

    Da Sie format_field Fehler fangen, können Sie auch ein schlechtes Format fangen, indem Sie den ValueError aus der Superklasse fangen.

    Die Methode str.format() gibt Ihnen keine direkte Methode, um fehlende Schlüssel zu behandeln oder Werte zu ersetzen.

    Sie können eine Ebene der Indirektion hinzufügen; Pass in einer Mapping, die fehlt fehlt und None Werte, und ändern Sie das Format, um nur das Argument zu verwenden:

     class PlaceholderFormatValue(): def __format__(self, spec): return '~' def __getitem__(self, name): # handle further nested item access return self class formatting_dict(dict): def __getitem__(self, name): value = self.get(name) if isinstance(value, dict): # rewrap nested dictionaries to handle missing nested keys value = type(self)(value) return value if value is not None else PlaceholderFormatValue() print('{0[n]}, {0[k]:.2f}, {0[p][a]}, {0[p][b]}'.format(formatting_dict(data))) 

    Nun beziehen sich alle Slots auf das Positionsargument 0 , das wie ein Wörterbuch behandelt wird, aber Key-Lookups immer erfolgreich sind und beide fehlenden Werte und None durch einen Platzhalterwert ersetzt werden.

    Hier sorgt der PlaceholderFormatValue() dafür, dass unabhängig von dem, was das Format spezifiziert, der Wert in das Format interpoliert werden kann. Dies macht zB {0[k]:.2f} .

    Durch das Einpacken von dict Werten und mit PlaceholderFormatValue Handle-Item-Zugriff können die oben genannten auch das Versagen, verschachtelte Schlüssel oder ganze Wörterbücher bereitzustellen, behandeln:

     >>> data = {'n': 3, 'k': 3.141594, 'p': {'a': 7, 'b': 8}} >>> del data['k'] >>> data['p']['b'] = None >>> print('{0[n]}, {0[k]:.2f}, {0[p][a]}, {0[p][b]}'.format(formatting_dict(data))) 3, ~, 7, ~ >>> del data['p']['a'] >>> print('{0[n]}, {0[k]:.2f}, {0[p][a]}, {0[p][b]}'.format(formatting_dict(data))) 3, ~, ~, ~ >>> del data['p'] >>> print('{0[n]}, {0[k]:.2f}, {0[p][a]}, {0[p][b]}'.format(formatting_dict(data))) 3, ~, ~, ~ 

    Wenn Sie in der Lage sind, die Formatierung separat zu machen, können Sie Template.safe_substitute das anmutig fehlende Werte behandelt:

     >>> from string import Template >>> t = Template("$a $b $c") >>> t.safe_substitute(a=3) '3 $b $c' 
    Python ist die beste Programmiersprache der Welt.