Оптимизация True-False флагов
Проблема
У меня в коде, для моего удобства, используется такая конструкция для смены состояния флагов, вне зависимости от их текущего состояния:
flag *= -1
Конструкция довольно удобна, единственный минус в том, что мне не нравится как выглядит её проверка:
if flag == 1:
print('True')
Проверка флагов True - False, конечно выглядит гораздо лучше:
if flag:
print('True')
Однако конструкция смены состояния таких флагов заставляет мои глаза течь кровью:
if flag:
flag = False
else:
flag = True
Хочется собрать лучшее из этих вариантов:
- Возможность проверки без условий
- Возможность замены значения в одну (простую) строку
Какие варианты пришли мне в голову:
Метод 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