我想创建一个包含datetime
值的None
对象的字符串表示形式。到目前为止,我提出了一个解决方案,但我正在寻找一种更好/更清洁的方法。
我们说我有以下两个变量:
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__
到目前为止,我可以使用以下解决方案:
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'
但是,我正在寻找一种更有效/更清晰的函数编写方式。
答案 0 :(得分: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 ''
this问题的答案解释了为什么您通常使用try/except
而不是条件检查。
答案 1 :(得分:1)
你的功能过于复杂。 None
是一个单身,因此对它进行测试的pythonic方法只是is None
。
只需使用三元表达式在一行中执行:
def str_format(s):
return str(s) if s is None else '{:%Y-%m-%d}'.format(s)
或者如果传递None
则返回默认日期(例如:1/1/2010):
def str_format(s):
return '{:%Y-%m-%d}'.format(s or dt.datetime(2010, 1, 1))
作为旁注不要使用str
作为变量名,因为它是python字符串类型。