Оптимизация 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)
.
Собственно вопрос:
А какой, на ваш взгляд, самый оптимальный способ хранения и переключения флагов? Скорее всего существует что-то очень простое, что может делать то, что я хочу, но прям сходу таких методов не нашлось.
Ах да, вопрос сугубо теоретический и скорее даже про "приятно глазу", но суть, в целом, надеюсь ясна
Ответы (2 шт):
Я с трудом понял эти сложности, а местами и не понял. Но попробую:
flag = True # начальное значение
flag = not flag # смена значения на противоположное
print(flag) # вывод на экран текущего значения
return flag # возврат текущего значения из функции
if flag: # если True...
if not flag: # если False...
flag = flag and my_function() # выполнение my_function() только в случае, если на входе flag = True, и формирование нового флага успешности в результате - для возможности выполнения следующего кода.