Лучший / более простой поток управления для: если A, elif B, если A или B, иначе - PullRequest
1 голос
/ 19 июня 2019

У меня есть следующий поток управления, и я чувствую, что его можно улучшить, но мне не хватает идеи, как ...

У меня есть два ВЗАИМНЫХ ИСКЛЮЧИТЕЛЬНЫХ условия и соответствующие действия, которые необходимо выполнить для конкретного условия (т. Е. Когда оно истинно) и для условия не определено (т. Е. Когда любое из них истинно). Также я хочу сделать что-то, когда ни одно из условий не соответствует.

Изначально у меня было:

if condition1:
    print("something only on condition1")
    print("also this because any condition is True")
elif condition2:
    print("something only on condition2")
    print("also this because any condition is True")
else:
    print("do this when no condition")

однако, когда "print (" также это потому, что любое условие - True ")" - это часть большого блока кода, кажется нецелесообразным повторять его. Таким образом я придумал

if condition1:
    print("something only on condition1")
elif condition2:
    print("something only on condition2")
if condition1 or condition2:
    print("also this because any condition is True")
else:
    print("do this when no condition")

это, однако, кажется несколько излишним. Поскольку оба условия уже были проверены по отдельности, условие с оператором «или» представляется излишне избыточным. Хотя я могу ошибаться.

Третий вариант будет

if condition1 or condition2:
    if condition1:
        print("something only on condition1")
    elif condition2:
        print("something only on condition2")
    print("also this because any condition is True")
else:
    print("do this when no condition")

однако, это также не является реальным улучшением, и я чувствую, что сложенные операторы даже сложнее понять.

Кроме того, я должен помнить, что я хочу, чтобы «также это, потому что любое условие истинно», выполнялось после любого из действий, относящихся к условию.

Моя цель / вопрос заключается в том, существует ли разумный способ упростить этот поток управления и сделать его легко понятным. Например, способ иметь только 3 блока управления (if, elif, else) или в общем случае оценивать каждое отдельное условие только один раз.

Спасибо:)

EDIT: Справочная информация о реальном задании (все еще упрощено):

есть два набора (которые могут быть больше в будущем):

img_extensions = ('.png', '.jpg')
video_extensions = ('.avi')

Теперь я получил некоторый путь [string] и хочу проверить, есть ли

path.endswith(img_extensions)      <- condition1
path.endswith(video_extensions)    <- condition2

Затем я создаю видео или изображение в соответствии с выполненным условием. Если любой из них верен, я сообщаю пользователю, что он был успешным Если не было выполнено ни одного условия, путь был неисправен, и я хочу сообщить об этом пользователю соответственно.

1 Ответ

1 голос
/ 19 июня 2019

вот как я бы это сделал:

conditions = {
    condition1: lambda: print("something only on condition1"),
    condition2: lambda: print("something only on condition2")
}

for condition, action in conditions.items():
    if condition:
        action()

if any(conditions.keys()):
    print('also this because any condition is True')
else:
    print('do this when no condition')

таким образом вы можете расширить структуру данных, чтобы иметь множество условий без редактирования вашей логики, а также удаления дубликатов

...