Оптимизация True-False флагов

Оптимизация True-False флагов


Проблема

У меня в коде, для моего удобства, используется такая конструкция для смены состояния флагов, вне зависимости от их текущего состояния:

flag *= -1

Конструкция довольно удобна, единственный минус в том, что мне не нравится как выглядит её проверка:

if flag == 1:
    print('True')

Проверка флагов True - False, конечно выглядит гораздо лучше:

if flag:
    print('True')

Однако конструкция смены состояния таких флагов заставляет мои глаза течь кровью:

if flag:
    flag = False
else:
    flag = True

Хочется собрать лучшее из этих вариантов:

  1. Возможность проверки без условий
  2. Возможность замены значения в одну (простую) строку

Какие варианты пришли мне в голову:

Метод 1: Класс

Самый логичный и питонячий метод — использовать класс. Минимально у меня получилось что-то такое:

class Flag():
    def __init__(self, val:bool):
        self.val = val
    def __bool__(self):
        return self.val

    def switch(self):
        if self.val:
            self.val = False
        else:
            self.val = True

И это даже работает, но проблема в том, что этот класс довольно неудобно вызывать:

Вместо flag = True надо делать flag = Flag(True). Что может выстрелить чеховским ружьём в самый неожиданный момент, когда я забуду прописать этот класс, или попробую получить значение флага от какого-то не моего метода.

Метод 2: Запихнуть флаг куда-то

Собственно, идея схожа с классом:

def switch(dct: dict):
    if dct['val']:
        dct['val'] = False
    else:
        dct['val'] = True

Минусы: вы вообще представляете как это хранить и проверять? Я представляю, и это максимально неудобно

Метод 3: вспомнить про return

def switch(val):
    if val:
        return False
    else:
        return True

my_flag = True
print(my_flag)
my_flag = switch(my_flag)
print(my_flag)

В целом, норм, но всё равно, мне не особо нравится конструкция my_flag = switch(my_flag).

Собственно вопрос:

А какой, на ваш взгляд, самый оптимальный способ хранения и переключения флагов? Скорее всего существует что-то очень простое, что может делать то, что я хочу, но прям сходу таких методов не нашлось.

Ах да, вопрос сугубо теоретический и скорее даже про "приятно глазу", но суть, в целом, надеюсь ясна





Например, так:

if flag:
    flag = False
else:
    flag = True
flag = not flag





Report Page