2016-08-04 1 views
0

Я искал как здесь, так и используя Google. | (pipe) является побитовым оператором OR, но я не могу найти ничего конкретного для моей проблемы. Вот example из Cinema4D Python SDK и имеет аргумент flags, где вы можете установить несколько идентификаторов, разделенных символом | символ.Python: как я могу получить доступ к идентификаторам, разделенным | (pipe) в аргументе

Что это конкретно и как получить доступ к идентификаторам в функции ниже?

ID_OK = 100 
ID_CANCEL = 101 

def Func(flags): 
    print flags 
    return 

Func(ID_OK|ID_CANCEL) 

.. 

>> 101 

спасибо.

ответ

0

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

Вы можете использовать двоичный код &, чтобы определить, установлен ли флаг. Например:

ID_OK = 0x01 
ID_CANCEL = 0x10 

def Func(flags): 
    print "0x%02x" % (flags) 
    if flags & ID_OK: 
     print "ID_OK" 
    if flags & ID_CANCEL: 
     print "ID_CANCEL" 

    print 
    return 

Func(ID_OK) 
Func(ID_CANCEL) 
Func(ID_OK|ID_CANCEL) 

Дает:

0x01 
ID_OK 

0x10 
ID_CANCEL 

0x11 
ID_OK 
ID_CANCEL 

Флаги, как правило, больше, чем это. Если у вас небольшое количество флагов, то это намного проще, если вы можете зарезервировать один nybble для каждого флага.

+0

Спасибо и DeepSpace, потребовалось некоторое время, но я это понимаю сейчас. – potiongraphics

0

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

Даже если статья говорит о C# вы можете получить идею: http://www.alanzucconi.com/2015/07/26/enum-flags-and-bitwise-operators/