Skip to main content
 首页 » 编程设计

python之`=` 对 python 集合和 bool 值有什么作用

2025年05月04日38grandyang

我在 shutil 中找到了一些代码我不理解的标准库中的模块。

_use_fd_functions最终持有一个 truthy/falsy 值,它是这样初始化的:

_use_fd_functions = ({os.open, os.stat, os.unlink, os.rmdir} <= 
                     os.supports_dir_fd and 
                     os.listdir in os.supports_fd and 
                     os.stat in os.supports_follow_symlinks) 

{os.open, os.stat, os.unlink, os.rmdir}都是函数,<= 的正确参数看起来像一个 bool 值,但根据消息来源,它们是函数和函数集。

我无法在 Python 3.5.2 repl 中重新创建此行为:(删除了回溯)

>>> {lambda x: x} <= True 
TypeError: unorderable types: set() <= bool() 
>>> {True} <= True 
TypeError: unorderable types: set() <= bool() 
>>> {lambda x: x} <= (lambda x: x+1) 
TypeError: unorderable types: set() <= function() 
>>> {lambda x: x} <= (lambda x: x+1) in {lambda x: x+1} 
TypeError: unorderable types: set() <= function() 

当然,由于经验丰富的开发人员无法在几秒钟内破译代码,因此代码太聪明了。但它是如何工作的,它有什么作用?

请您参考如下方法:

您的答案可以在 os module 中找到:

_set = set() 
_add("HAVE_FACCESSAT",  "access") 
_add("HAVE_FCHMODAT",   "chmod") 
_add("HAVE_FCHOWNAT",   "chown") 
_add("HAVE_FSTATAT",    "stat") 
_add("HAVE_FUTIMESAT",  "utime") 
_add("HAVE_LINKAT",     "link") 
_add("HAVE_MKDIRAT",    "mkdir") 
_add("HAVE_MKFIFOAT",   "mkfifo") 
_add("HAVE_MKNODAT",    "mknod") 
_add("HAVE_OPENAT",     "open") 
_add("HAVE_READLINKAT", "readlink") 
_add("HAVE_RENAMEAT",   "rename") 
_add("HAVE_SYMLINKAT",  "symlink") 
_add("HAVE_UNLINKAT",   "unlink") 
_add("HAVE_UNLINKAT",   "rmdir") 
_add("HAVE_UTIMENSAT",  "utime") 
supports_dir_fd = _set 

os.supports_dir_fd是一组函数。

在 Python 中 and有lower precedence比<=所以你的集合比较首先被评估。对于 set此运算符检查第一组是否为 is a subset第二组。

os.supports_dir_fd列出您可以执行的文件操作类型。这可能因操作系统而异,因此 os模块根据当前环境采用不同的代码路径。对于每个函数,_add将检查当前操作系统是否允许它。因此,您询问的代码片段的目的是查看操作是否 open , stat , unlink和 rmdir受支持,然后它对 shutil 的特定行为进行更多检查想用。最后,_use_fd_functions会告诉如果 shutil应该使用文件描述符函数(“fd”),这取决于您在当前环境中可以做什么。