我一直着迷于__future__
模块 - 特别是它能够改变 python 中语句的解析方式。
最有趣的是如何做类似的事情
from __future__ import print_function
使您能够使用print
(并不是print_function
,就像您期望任何其他正常导入一样)。
我读过了Python 中 __future__ 的用途是什么,如何/何时使用它,以及它是如何工作的彻底地、特别地遇到了一条特定的线:
future 语句是向编译器发出的指令,表明特定的
模块应该使用语法或语义来编译
在 Python 的指定未来版本中可用。
我很想知道到底是什么让这一切成为可能。特别是,如何像
from __future__ import division
可以在python2上启用真正的除法,同时
from __future__ import barry_as_FLUFL
可以启用<>
python3 上的语法(我发现最有趣的是你必须从“导入一个功能”__future__
“为了向后兼容)。
无论如何,总而言之,我想知道编译器在以下情况下如何理解和执行该指令:__future__
或其文物是进口的。
from __future__ import print_function
告诉解析器不治疗print作为关键字(将其保留为名称)。这样编译器会将其视为函数而不是语句。
为了追踪这一点,compiler
结构体有一个c_future
字段包含一个PyFutureFeatures
跟踪已启用哪些未来指令的对象。解析器和编译器的各个部分检查标志并改变行为。
这主要是在future.c源文件,其中有一个future_parse()功能检查import from
模块参数设置为的 AST 对象__future__
,并根据发现的内容设置标志。
例如,对于barry_as_FLUFL
“特征”,解析器refuses !=as 语法但接受<> 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;
}
}
您可以通过 grep 找到其他示例FUTURE_*
flags 列于compile.h.
请注意,有一个__future__Python模块,但不直接参与代码的解析和编译;它只是为了让 Python 代码可以轻松访问有关指令的元数据(包括传递给flags
的论点compile()功能),仅此而已。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)