Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有没有办法把if..else语句写在一行中?_Python_Django - Fatal编程技术网

Python 有没有办法把if..else语句写在一行中?

Python 有没有办法把if..else语句写在一行中?,python,django,Python,Django,我是python和django的新手,现在我正在学习如何在一行中编写if..else语句来简化代码 但在这种情况下,我有两个查询集,有一点变化。 我想知道是否有可能将此代码简化为一行 if self.booked: x = qs.filter(content_id=content_id, object_id=model.id, action=10) else: x = qs.filter(content_id=content_id, object_id=model.id)

我是python和django的新手,现在我正在学习如何在一行中编写
if..else
语句来简化代码

但在这种情况下,我有两个查询集,有一点变化。 我想知道是否有可能将此代码简化为一行

 if self.booked:
     x = qs.filter(content_id=content_id, object_id=model.id, action=10)
 else:
     x = qs.filter(content_id=content_id, object_id=model.id).exclude(action=10)
 return x

这是可能的,但会使结果难以理解:

return qs.filter(content_id=content_id, object_id=model.id, action=10) if self.booked else qs.filter(content_id=content_type_id, object_id=model.id).exclude(action=10)

这是可能的,但会使结果难以理解:

return qs.filter(content_id=content_id, object_id=model.id, action=10) if self.booked else qs.filter(content_id=content_type_id, object_id=model.id).exclude(action=10)

if self.booked
条件看起来非常重要,让它在代码中脱颖而出符合您的利益

但如果要简化,可以提取查询集的公共部分:

qs = qs.filter(object_id=model.id)
if self.booked:
    qs = qs.filter(content_id=content_id, action=10)
else:
    qs = qs.filter(content_id=content_type_id).exclude(action=10)
return qs

if self.booked
条件看起来非常重要,让它在代码中脱颖而出符合您的利益

但如果要简化,可以提取查询集的公共部分:

qs = qs.filter(object_id=model.id)
if self.booked:
    qs = qs.filter(content_id=content_id, action=10)
else:
    qs = qs.filter(content_id=content_type_id).exclude(action=10)
return qs

我将对其进行重新表述,以便公共部分不在if范围内:

qs = qs.filter(content_id=content_id, object_id=model.id)
return qs.filter(action=10) if self.booked else qs.exclude(action=10)
虽然它看起来很神秘,特别是因为动作10是硬编码的。您至少应该定义一个具有明确名称的常量


编辑:哇,这实际上是错误的,因为在“如果”的一边,你过滤内容的id,另一边过滤内容的id。这是我的bug还是你的bug?至少它证明了您的代码很难阅读…

我会重新表述它,以便公共部分不在if:

qs = qs.filter(content_id=content_id, object_id=model.id)
return qs.filter(action=10) if self.booked else qs.exclude(action=10)
虽然它看起来很神秘,特别是因为动作10是硬编码的。您至少应该定义一个具有明确名称的常量


编辑:哇,这实际上是错误的,因为在“如果”的一边,你过滤内容的id,另一边过滤内容的id。这是我的bug还是你的bug?至少它证明了您的代码很难阅读……

Python代码的全部要点在于它清晰易读。在我看来,没有一种方法可以把它写在一行中,你可以说它清晰易读,所以我会保持原样。一个技巧是尽量将每行代码的宽度控制在80个字符以内。“pythonic”代码的全部要点是它清晰易读。在我看来,没有一种方法可以把它写在一行中,你可以说它清晰易读,所以我会保持原样。一个技巧是尽量将每行代码的宽度控制在80个字符以内。感谢您的快速回复。但是queryset几乎是相似的。只有一点不同。有没有办法不重复代码?谢谢你的快速回复。但是queryset几乎是相似的。只有一点不同。有没有办法不重复代码?您可以使用
return(qs.filter if self.booked else qs.exclude)(action=10)
@TigerhawkT3:很好,但您会在生产代码中编写吗?@RemcoGerlich-取决于我当时的心情。:)如果“它看起来很神秘”,这不是一个好的解决方案!代码应该力求清晰易懂。@zaph:我的意思是它看起来很神秘,因为它不清楚action 10是什么,也不清楚如果self.booked和其他所有人都不清楚,为什么只显示action 10;但是我不能解决这个问题。你可以通过
返回(qs.filter if self.booked else qs.exclude)(action=10)来消除更多的重复。
@TigerhawkT3:很好,但是你会在生产代码中写吗?@RemcoGerlich-取决于我当时的心情。:)如果“它看起来很神秘”,这不是一个好的解决方案!代码应该力求清晰易懂。@zaph:我的意思是它看起来很神秘,因为它不清楚action 10是什么,也不清楚如果self.booked和其他所有人都不清楚,为什么只显示action 10;但我不能解决这个问题。