2017-12-04 10 views
1

Ich möchte eine Zeichenfolgendarstellung eines datetime Objekts erstellen, das einen None Wert enthalten könnte. Bisher habe ich eine Lösung gefunden, aber ich habe nach einer besseren/saubereren Methode gesucht.Bedingte Zeichenfolgendarstellung basierend auf Variablentyp

Lassen Sie uns sagen, dass ich die beiden folgenden Variablen:

import datetime as dt 

a = None 
b = dt.datetime(2017, 11, 30) 


def str_format(str): 
    return '{:%Y-%m-%d}'.format(str) 

Die folgende würde einen formatierten String zurück:

str_format(b) 
'2017-11-30' 

Aber die folgenden würde einen Fehler zurück:

str_format(a) 
TypeError: unsupported format string passed to NoneType.__format__ 

Bisher kann ich mit folgender Lösung aufwarten:

def str_format(str): 
    if isinstance(str, type(None)) is False: 
     return '{:%Y-%m-%d}'.format(str) 
    else: 
     return '{}'.format(str) 

str_format(a) 
'None' 

str_format(b) 
'2017-11-30' 

Allerdings suchte ich nach einer effizienteren/saubereren Schreibweise der Funktion.

+2

Ich denke, dass es besser ist zu testen, ob Ihr Parameter datetime ist. 'isinstance (b, dt.datetime)', Sie sind sicher, dass Sie den richtigen Typ formatieren – mdlx

Antwort

1

Ihre Funktion ist überkomplex. None ist ein Singleton, so ist die pythonische Art des Tests dagegen nur is None.

machen Sie es einfach in einer Linie mit einem ternären Ausdruck:

def str_format(s): 
    return str(s) if s is None else '{:%Y-%m-%d}'.format(s) 

oder ein Standard Datum zurückzubringen (ex: 1.1.2010), wenn None geben wird:

def str_format(s): 
    return '{:%Y-%m-%d}'.format(s or dt.datetime(2010, 1, 1)) 

als Eine Seitennotiz verwendet str nicht als Variablennamen, da dies der Python-String-Typ ist.

2

mal Oft sind diese Arten von Dingen in einem try/except

def str_format(str): 
    try: 
    return '{:%Y-%m-%d}'.format(str) 
    except TypeError: 
    # unrecognized type, return blank or whatever you want to return 
    return '' 

Die Antwort auf this Frage gewickelt erklärt, warum der Regel Sie try/except anstelle einer bedingten Prüfung ziemlich gut verwenden.

Verwandte Themen