2012-05-03 2 views
0

У меня есть несколько условий, например:Python: бинарное условия

if condition: 
    flag1 = True 
flag2 = testfunc() 
flag3 = bool(variable) 
if not flag1 and not flag2 and not flag3: 
    do0 
elif flag1 and flag2: 
    do1 
elif flag2 and flag3: 
    do2 

Могу ли я изменить его на что-то вроде этого:

flags = 0 
if condition: 
    flags += 1 
if testfunc(): 
    flags += 2 
if bool(variable): 
    flags += 4 
if flags == 0: 
    do0 
elif flags == 3: 
    do1 
elif flags == 6: 
    do2 

Как вы можете понять, может быть значения 0, 1, 2, 4, 8, 16, 32, ... для условий. Возможно ли сделать что-то подобное в Python? Благодаря!

ОБНОВЛЕНИЕ. Это что-то вроде условий в модулях re и PyQt4 (где вы можете установить что-то вроде re.UNICODE | re.DOTALL).

Пример из re модуля:

DOTALL = 16 
I = 2 
IGNORECASE = 2 
L = 4 
LOCALE = 4 
M = 8 
MULTILINE = 8 
S = 16 
U = 32 
UNICODE = 32 
VERBOSE = 64 
X = 64 

ответ

2

Да, это вполне возможно сделать это - ваш код должен работать нормально, как (данные переменные и функции объявлены).

Это хорошая идея? Не совсем - это гораздо менее очевидно, когда вы читаете, что вы имеете в виду. Прежде всего, читаемость.

Если ваша проблема с большим количеством and с, то вы можете очистить его другими способами:

if not any(condition, flag2, variable): 

Использование any() и all() часто может помочь упростить вещи вниз.

+0

Вау, кажется, очень полезно. Я возьму его на вооружение! – ghostmansd

+0

Однако создатели PyQt4 и re, похоже, использовали способ, который я прошу. Просто для образования будет полезно понять, как получить что-то подобное. Они использовали биты для этого? – ghostmansd

+0

@ghostmansd Это [побитовые операторы] (http://docs.python.org/reference/expressions.html#binary-bitwise-operations) - я бы предположил, что они используются больше для согласованности с базовыми библиотеками C и будут утверждают против написания кода на чистом питоне, который работал одинаково. –

Смежные вопросы