Seite 1 von 1

format() und None

Verfasst: Mittwoch 14. Oktober 2015, 07:03
von Hase
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.

Re: format() und None

Verfasst: Mittwoch 14. Oktober 2015, 07:07
von sparrow
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.

Re: format() und None

Verfasst: Mittwoch 14. Oktober 2015, 07:29
von Hase
Ja, danke, die erste Version gefällt mir.

Die zweite Version geht leider nicht, da die float-Werte auch 0 (Null) sein können.

Re: format() und None

Verfasst: Mittwoch 14. Oktober 2015, 07:30
von mutetella
@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

Re: format() und None

Verfasst: Mittwoch 14. Oktober 2015, 07:49
von Hase
@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.

Re: format() und None

Verfasst: Mittwoch 14. Oktober 2015, 08:20
von Sirius3
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))