Эти имена числовые константы , каждое в степени 2. Это означает, что они являются целыми числами с однобитным набором .
Вы можете объединить такие числа с |
, чтобы получить целое число с множеством установленных битов, каждый бит представляет определенную опцию:
>>> import fcntl
>>> fcntl.LOCK_SH # bit 1 set
1
>>> fcntl.LOCK_EX # bit 2 set
2
>>> fcntl.LOCK_NB # bit 3 set
4
>>> fcntl.LOCK_UN # bit 4 set
8
>>> fcntl.LOCK_SH | fcntl.LOCK_UN # combine bits 1 and 4
9
>>> format(fcntl.LOCK_SH | fcntl.LOCK_UN, '04b')
'1001'
Это очень распространенный способ передачи настроек конфигурации в системные вызовы. fctnl.lock()
является одним из таких примеров, но есть много других, где применяется та же техника. os.open()
call является другим примером, так же как и re
флаги модуля .
Важно понимать, что это просто целые числа . Вместо установки флагов с помощью fcntl.LOCK_EX | fcntl.LOCK_NB
(установка битов 2 и 3), вы можете просто передать 6
:
fcntl.lockf(fp, 6)
и не будет никакой разницы, если говорить о функции lockf()
. Смысл использования именованных констант заключается в том, что при использовании этих кодов самодокументируется код .