我的代码如下:
if query.orderby:
for q in query.orderby:
if 'severity' in q:
注意:query.orderby是一个包含字典的列表,看起来像这样 [{"severity": "asc"},{"name": "desc"}] 如何优化这些代码行?有没有办法替换for循环并且仍然获得与上述代码相同的功能?
我的代码如下:
if query.orderby:
for q in query.orderby:
if 'severity' in q:
如果不了解 if condition
中发生了什么,很难为您提供优化建议,但是如果循环的结果是列表,则可以使用 列表推导式:
# ensure query.order_by is iterable
query.order_by = query.orderby if geattr(query, 'orderby', None) else []
result = [ item for item in query.order_by if 'severity' in item]
query.order_by = query.orderby if geattr(query, 'orderby', None) else []
for item in filter(lambda x: 'severity' in x, items):
print item['severity']
filtered = [q for q in query.orderby if 'severity' in q]
x = [{"severity": "asc"}, {"name": "desc"}]
for e in x:
for key, value in e.iteritems():
if 'severity' in key:
print 'yes'
你的初始声明
if query.orderby:
鉴于您对我的评论的回答
orderby
并不总是需要出现
这不是你想要的...看看这个交互式会话
In [1]: class Query(): pass
In [2]: query = Query()
In [3]: query.orderfrom = 1
In [4]: if query.orderfrom: print(1)
1
In [5]: if query.orderby: print(1)
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-5-27f5f9b9569b> in <module>()
----> 1 if query.orderby: print(1)
AttributeError: 'Query' object has no attribute 'orderby'
In [6]:
我的建议是使用 try
... except
语句块
try:
orderby = query.orderby
except AttributeError:
orderby = []
for q in orderby:
if 'severity' in q:
...
或者是基于 getattr()
的解决方案,正如 Andriy Ivaneyko 提出的那样,但更简单。
# use getattr to have the attribute OR a convenient, here [], default.
orderby = getattr(query, 'orderby', [])
for q in orderby:
if 'severity' in q:
...
query
总是有一个属性.orderby
,那么你的第一个if
(if query.orderby:
)是多余的。否则,你的for
循环后面跟着一个if
,至少在我看来,和一个迭代过滤版本的query.orderby
相比,例如for q in (q in query.orderby if 'severity' in q)
,它是一样好的——你目前的实现(除了第一个可以被删除的if
)增加了一个缩进级别,但以更清晰的方式表达了你的目的。 - gboffi