我有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!")
然而,这段代码似乎很笨拙,我敢肯定,有一种更为简洁的编写方式,因为它实际上是在重复代码。有什么建议吗?
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!")
您可以删除上面的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!")
如果您知道仅填充了一个列表,则可以按顺序运行两个循环:
for value in values_to_remove:
# body elided
for value in values_to_keep:
# body elided
或由于主体相同:
for value in values_to_remove + values_to_keep:
# body here