我有3个列表。
values_to_add = []
values_to_remove = []
values_to_keep = []
一次仅填充列表之一。如果填充了两个列表之一,我想执行此操作:
if values_to_remove or values_to_keep:
if values_to_remove:
for value in values_to_remove:
try:
value_object.related_value.get(value=value)
except exceptions.ObjectDoesNotExist:
raise UnableToUpdate("These values are not related!")
elif values_to_keep:
for value in values_to_keep:
try:
value_object.related_value.get(value=value)
except exceptions.ObjectDoesNotExist:
raise UnableToUpdate("These values are not related!")
但是,这段代码似乎很笨拙,我相信有一种更简洁的编写方式,因为它实际上是在重复代码。有什么建议吗?
答案 0 :(得分:2)
if values_to_remove or values_to_keep:
for value in (values_to_remove if len(values_to_remove) else values_to_keep):
try:
value_object.related_value.get(value=value)
except exceptions.ObjectDoesNotExist:
raise UnableToUpdate("These values are not related!")
答案 1 :(得分:1)
您可以删除上面的if语句,它可能不会对代码的功能产生任何影响。这样可以使其更清洁,更快一些。
if values_to_remove:
for value in values_to_remove:
try:
value_object.related_value.get(value=value)
except exceptions.ObjectDoesNotExist:
raise UnableToUpdate("These values are not related!")
elif values_to_keep:
for value in values_to_keep:
try:
value_object.related_value.get(value=value)
except exceptions.ObjectDoesNotExist:
raise UnableToUpdate("These values are not related!")
您还可以使用矩阵(二维数组)遍历所有数组,如下所示:
values = [
[], #values_to_keep
[] #values_to_remove
]
for array in values:
if array:
for value in values_to_remove:
try:
value_object.related_value.get(value=value)
except exceptions.ObjectDoesNotExist:
raise UnableToUpdate("These values are not related!")
break
尽管我只建议使用更多的数组来执行此操作,否则将使您的代码变得比所需的复杂。
答案 2 :(得分:0)
如果您知道仅填充了一个列表,则可以按顺序运行两个循环:
for value in values_to_remove:
# body elided
for value in values_to_keep:
# body elided
或者因为主体相同:
def body(value):
# body elided
for value in values_to_remove + values_to_keep:
body(value)