管道 ("bitwise OR") 调用 fcntl.lockf()

pipe ("bitwise OR") in call to fcntl.lockf()

This answer 包含以下行:

fcntl.lockf(fp, fcntl.LOCK_EX | fcntl.LOCK_NB)

管道,在Python一个"bitwise OR"

我已经检查了 Python 文档中的 fcntl.lockf(fd, cmd, len=0, start=0, whence=0),它说 cmd 是以下之一:

LOCK_UN – unlock

LOCK_SH – acquire a shared lock

LOCK_EX – acquire an exclusive lock

也一直在阅读这些变量here

有没有人了解那一行及其作用,以及它是否可以仅使用一个参数而不使用管道符号?

LOCK_NB 甚至没有在 Python 文档中提及..

这些名称是数字常量,每个都是 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 is another example, as are the re module flags.

重要的是要认识到这些 只是整数。您可以传入 6:

而不是使用 fcntl.LOCK_EX | fcntl.LOCK_NB 设置标志(设置位 2 和 3)
fcntl.lockf(fp, 6)

lockf()函数而言,没有区别。使用命名常量的要点在于,使用这些可以生成 自文档化代码 .