转换为lambda表达式?

问题描述

是否可以将以下内容转换为lambda表达式?

def default(o):
    if isinstance(o,(datetime.date,datetime.datetime)):
        return o.isoformat()

json.dumps(raw,default=default)

类似的东西:

json.dumps(raw,default=lambda o: o.isoformat() if isinstance(o,datetime.datetime))...? )

解决方法

您需要一个else才能完成条件表达式。由于如果函数不执行显式的None语句,则默认情况下会返回return,因此您的else应该是这样。

json.dumps(raw,default=lambda o: o.isoformat() if isinstance(o,(datetime.date,datetime.datetime)) else None)
,

正如您所描述的,您还可以在其中添加else语句以处理从if检查返回false的输出(为了获得一定的可读性,分割的行,python可能更喜欢oneliner)。

json.dumps(raw,default=lambda o: o.isoformat() 
                                  if isinstance(o,datetime.datetime)) 
                                  else None)
,

应该能够:

default = lambda o: o.isoformat() if isinstance(
    o,datetime.datetime)) else o.__dict__

您也可以使用None来获得回报,但是如果您要包含一个JSONEncoder不会出现的自定义对象,那么您会发现这样做的后果:

default = lambda o: o.isoformat() if isinstance(
    o,datetime.datetime)) else None


class A:
    def __init__(self,x):
        self.x = x


a = A(10)
d = {'date': datetime.datetime.now(),'myobject': a}
f = json.dumps(z,default=default)

>>> json.loads(f)
{'date': '2020-08-13T22:35:46.872594','myobject': None}

相同,但带有o.__dict__

>>> json.loads(f)
{'date': '2020-08-13T22:36:22.512864','myobject': {'x': 10}}

尽管理想情况下,您应该使用自定义对象设置__repr__,然后甚至可以重新创建对象。