format() und None

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Hase
User
Beiträge: 100
Registriert: Donnerstag 1. Oktober 2009, 15:17
Wohnort: Bremer Speckgürtel

Hallo und guten Morgen!

Ich habe eine Liste, die entweder float-Werte enthält, oder None. Diese Liste soll im Terminal ausgegeben werden.

Gibt es eine einfache Möglichkeit, dass mit print "{}".format() bei None kein Fehler geworfen wird, sondern nur ein "" ausgegeben wird? Ich meine, ohne vorher auf None zu testen oder try...except, sondern als Option von .format().

Danke!
Ingo H.
Benutzeravatar
sparrow
User
Beiträge: 4165
Registriert: Freitag 17. April 2009, 10:28

In den Parametern, ja.

Code: Alles auswählen

a=None
print("{0}".format((a if a is not None else "",)))
Oder auch:

Code: Alles auswählen

a=None
print("{0}".format((a or "")))
Wobei ich mir gerade nicht sicher bin, ob das konsistent ist.
Hase
User
Beiträge: 100
Registriert: Donnerstag 1. Oktober 2009, 15:17
Wohnort: Bremer Speckgürtel

Ja, danke, die erste Version gefällt mir.

Die zweite Version geht leider nicht, da die float-Werte auch 0 (Null) sein können.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@Hase
Als `format`-Option nicht, nein. Wobei ein `None`, anderst als von Dir beschrieben, auch keinen Fehler provoziert:

Code: Alles auswählen

>>> print('{}'.format(None))
None
Zu der von sparrow gezeigten Lösung könnte man das "Problem" auch schon außerhalb lösen:

Code: Alles auswählen

>>> def replace_none(iter_, with_):
...     for item in iter_:
...         yield with_ if item is None else item
...
>>> with_none = [1.2, 3.45, None, 6.9]
>>> for item in replace_none(with_none, ''):
...     print('{}'.format(item))
... 
1.2
3.45

6.9
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Hase
User
Beiträge: 100
Registriert: Donnerstag 1. Oktober 2009, 15:17
Wohnort: Bremer Speckgürtel

@mutetella

Danke. Ich wollte es nicht komplizierter machen, als es ist. Ja, Python schmeißt in diesem Fall keinen Fehler bei None, aber schreibt halt 'None' hin, und die Benutzer fragen mich dann immer "Was heißt denn Nooonee?" Deshalb sollte einfach nichts dastehen.
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

Man kann sich auch einfach einen neuen Formatter definieren, dann gehen auch Formatierungsanweisungen:

Code: Alles auswählen

class NoneFormatter(object):
    def __init__(self, value):
        self.value = value

    def __format__(self, fmt):
        return '' if self.value is None else '{0:{1}}'.format(self.value, fmt)

for value in [4.5, None, 17]:
    print('{0:.3f}'.format(NoneFormatter(value))
Antworten