Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 未来进口产品如何运作_Python_Python 2.7_Import_Python Internals_Compiler Directives - Fatal编程技术网

Python 未来进口产品如何运作

Python 未来进口产品如何运作,python,python-2.7,import,python-internals,compiler-directives,Python,Python 2.7,Import,Python Internals,Compiler Directives,我一直对\uuu future\uuu模块着迷,特别是它改变python中语句解析方式的能力 最有趣的是如何做这样的事情 from __future__ import print_function from __future__ import division 允许您使用print(而不是print\u功能,就像您期望的任何其他正常导入一样) 我已经仔细阅读了,特别是遇到了一行: future语句是编译器的一个指令,它指定了一个特定的 模块应使用以下语法或语义进行编译: 在指定的Python

我一直对
\uuu future\uuu
模块着迷,特别是它改变python中语句解析方式的能力

最有趣的是如何做这样的事情

from __future__ import print_function
from __future__ import division
允许您使用
print
(而不是
print\u功能
,就像您期望的任何其他正常导入一样)

我已经仔细阅读了,特别是遇到了一行:

future语句是编译器的一个指令,它指定了一个特定的 模块应使用以下语法或语义进行编译: 在指定的Python未来版本中提供

我很想知道到底是什么让这成为可能。特别是

from __future__ import print_function
from __future__ import division
可以在python2上启用真正的除法,而

from __future__ import barry_as_FLUFL
可以在python3上启用
语法(我发现最有趣的是,为了向后兼容,您必须从“
\uuuuuuuuuuuuuuuuuuu
”导入一个功能)


总之,我想知道当导入
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

from\uuuuuu future\uuuuuu导入打印\u函数
告诉解析器(将其保留为名称)。这样,编译器将其视为函数而不是语句

为了跟踪这一点,
compiler
struct有一个
c_future
字段,其中包含一个
pyfutureffeatures
对象,该对象跟踪已启用的未来指令。解析器和编译器的各个部分检查标志并改变行为

这主要是在中处理的,它有一个检查从AST对象导入的
,模块参数设置为
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,并根据找到的内容设置标志

例如,对于
barry\u as\u FLUFL
“功能”,解析器:

if(type==NOTEQUAL){
如果(!(ps->p_标志和CO_未来_巴里_AS_BDFL)&&
strcmp(str,“!=”){
PyObject_-FREE(str);
err_ret->error=E_语法;
打破
}
否则如果((ps->p_标志和CO_未来_巴里_AS_BDFL)&&
strcmp(str,“”){
PyObject_-FREE(str);
err_ret->text=“以Barry为BDFL,使用“””
“而不是“!=”;
err_ret->error=E_语法;
打破
}
}
您可以通过对
FUTURE.*
标志进行灰显找到其他示例


注意有一个,但它不直接参与代码的解析和编译;它只是让Python代码能够轻松访问有关指令的元数据(包括要传递给的
标志
参数的位字段值),仅此而已。

因为它不是正常的导入。请参阅@jornsharpe“总之,我想知道在导入future或其人工制品时编译器是如何理解和执行该指令的。”我已经做了我的研究,但无论如何还是要感谢否决票。我可能应该更改标题,以阻止注意力持续时间短的人反对否决票。我觉得无论我的意见值多少,这个问题肯定有一些实质性的东西。@Ev.Kounis这3个否决票和1个接近的投票人都会不同意,但不管怎样,就像我说的。。。可能是我的错,我已经知道了。我想知道它在引擎盖下是如何工作的。。。这就是这个问题的目的。@cᴏʟᴅsᴘᴇᴇᴅ: 那是。。我觉得巴里最有趣的是,他必须来自未来,而不是像过去这样更明智的东西。谢谢你一如既往的回答。