1

我正在构建一个 json,我想将一个逗号分隔的列表 ID 拆分为 ID 数组并放入 json 中。问题是该列表在数据库中也可以为 NULL,因此在 python 中为 None

部分代码如下所示:

'followupsteps': [{
    'id': stepid,
} for stepid in string.split(step.followupsteps, ',') 

我试过这样的事情:

'followupsteps': [{
    'id': stepid,
} for stepid in (string.split(step.followupsteps, ',') if not None else [])]

'followupsteps': [{
    'id': stepid,
} for stepid in string.split((step.followupsteps if not None else ''), ',')]

它们都导致 Django/python 错误:异常值:'NoneType' 对象没有属性'split'

有任何想法吗?

4

2 回答 2

7

您想测试是否step.followupsteps为布尔值 true:

'followupsteps': [] if not step.followupsteps else [{
    'id': stepid,
} for stepid in step.followupsteps.split(',')]

相反,您正在测试是否not None为真,它恰好是:

>>> bool(not None)
True

not step.followupsteps如果它是空字符串None、数字 0 或空容器,则为 True。您也可以使用if step.followupsteps is None,但为什么要限制自己。

另一种拼写方式:

'followupsteps': [{
    'id': stepid,
} for stepid in (step.followupsteps.split(',') if step.followupsteps else [])]

但是通过首先返回一个空列表,您可以完全避免空列表理解。

于 2013-08-09T15:35:50.050 回答
2

您的三元语句扩展为:

if not None:
   step.followupsteps
else:
   ''

not None总是计算为True,所以这相当于根本不写if/else语句。

你想写作(thing to evaluate) if step.followupsteps else (default thing),利用对象的“虚假性” None。或者,如果更方便,(default thing) if not step.followupsteps else (thing to evaluate).

于 2013-08-09T15:35:41.400 回答