gpt4 book ai didi

python - __future__ 导入是如何工作的

转载 作者:太空狗 更新时间:2023-10-30 02:16:09 25 4
gpt4 key购买 nike

我一直对 __future__ 着迷模块——特别是,它能够改变语句在 python 中的解析方式。

最有趣的是如何做类似的事情

from __future__ import print_function

使您能够使用 print (而不是 print_function ,就像您期望任何其他正常导入一样)。

我已阅读 What is __future__ in Python used for and how/when to use it, and how it works彻底地,特别是遇到了一条特定的线:

A future statement is a directive to the compiler that a particular module should be compiled using syntax or semantics that will be available in a specified future release of Python.

我很想知道究竟是什么让这成为可能。特别是,像

from __future__ import division

可以在python2上启用真除法,而

from __future__ import barry_as_FLUFL

可以启用 <> python3 上的语法(我觉得最有趣的是你必须从“__future__”导入一个特性以实现向后兼容性)。

总而言之,我想知道编译器在 __future__ 时如何理解和执行该指令。或其人工制品是进口的。

最佳答案

from __future__ import print_function告诉解析器 not treat print as a keyword (将其保留为名称)。这样编译器会将其视为函数而不是语句。

为了跟踪这个,compiler结构有一个 c_future包含 PyFutureFeatures 的字段跟踪哪些 future 指令已启用的对象。解析器和编译器的各个部分检查标志并改变行为。

这主要在 future.c source file 中处理,它有一个 future_parse() function检查 import from模块参数设置为 __future__ 的 AST 对象,并根据找到的内容设置标志。

例如,对于 barry_as_FLUFL “功能”,解析器 refuses != as syntax but accepts <> instead :

if (type == NOTEQUAL) {
if (!(ps->p_flags & CO_FUTURE_BARRY_AS_BDFL) &&
strcmp(str, "!=")) {
PyObject_FREE(str);
err_ret->error = E_SYNTAX;
break;
}
else if ((ps->p_flags & CO_FUTURE_BARRY_AS_BDFL) &&
strcmp(str, "<>")) {
PyObject_FREE(str);
err_ret->text = "with Barry as BDFL, use '<>' "
"instead of '!='";
err_ret->error = E_SYNTAX;
break;
}
}

您可以通过搜索 FUTURE_* 找到其他示例旗帜 listed in compile.h .

请注意,有一个 __future__ Python module ,但不直接参与代码的解析和编译;它只是为了让 Python 代码轻松访问有关指令的元数据(包括要传递给 flags functioncompile() 参数的位域值),仅此而已。

关于python - __future__ 导入是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45801522/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com