2017-12-04 24 views
1

None値を含むdatetimeオブジェクトの文字列表記を作成したいとします。これまでのところ、私は解決策を考案しましたが、私はより良い/よりクリーンな方法を探していました。変数タイプに基づく条件付き文字列の表現

のは、私は次の2つの変数があるとしましょう:

import datetime as dt 

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


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

フォーマットされた文字列が返されます以下:

str_format(b) 
'2017-11-30' 

をしかし、エラーが返されます以下:

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

をこれまでのところ、私は以下の解決策をとることができます:

しかし、私は、より効率的で洗練された関数の書き方を検討していました。

+2

パラメータがdatetimeの型であるかどうかをテストする方が良いと思います。 'isinstance(b、dt.datetime)'、あなたは正しいタイプをフォーマットすることを確信しています – mdlx

答えて

1

あなたの機能は過剰です。 Noneはシングルトンなので、テストするためのPythonの方法はちょうどis Noneです。

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

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

またはデフォルトの日付(例:2010年1月1日)を返すために:Noneが渡された場合

ちょうど三元表現と1行でそれを行います副作用は、Pythonの文字列型であるため、変数名としてstrを使用しません。

2

は、多くの場合、物事のこれらのタイプは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 '' 

に回包まれているあなたは一般的にかなりよく代わりに条件チェックのtry/exceptを使用する理由this質問の答えは説明しています。

関連する問題