__future__ 导入在幕后是如何工作的

2023-12-14

我一直着迷于__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(使用前将#替换为@)

__future__ 导入在幕后是如何工作的 的相关文章

随机推荐

  • 当前可用的最好的 Ajax 历史记录和书签插件 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 似乎每个 Ajax 历史记
  • 如何为 Apache-CXF JAX-WS 启用 Spring Security

    如何在 Apache CXF 上为 apache JAX WS 启用 Spring Security 网络上的示例包括 Jax RS 示例 但我不使用 Jax RS 我不想使用 cxf 的安全性 如何在我的代码中实现它 两种可能的方式 Pu
  • gitignore 没有扩展名的二进制文件

    如何在中忽略二进制文件git使用 gitignore file 例子 g hello c o hello hello 文件是一个二进制文件 能git忽略这个文件 Ignore all Unignore all with extensions
  • Excel VBA 强制关闭 IE

    我目前正在使用以下子程序在自动化后关闭我的 IE Public Sub CloseIE Dim Shell As Object Dim IE As Object Set Shell CreateObject Shell Applicatio
  • 运算符重载中的类数据封装(私有数据)

    下面是代码 代码 访问说明符适用于类级别 而不是实例级别 因此Rational类可以查看任何其他类的私有数据成员Rational实例 自从你的Rational operator 是一个成员函数 它可以访问它的私有数据Rational争论 注
  • jquery动态绑定.on()选择父母还是孩子?

    例如 dataTable tbody tr on click function alert this text dataTable tbody on click tr function alert this text on 将 tr 与单击
  • opengl:将原点更改为左上角

    我在将 openGL 原点设置为视图的左上角时遇到问题 因此 在我的窗口调整大小处理程序中 我执行以下操作 ox and oy are some offsets and width and height are the required v
  • 有没有更好的方法来找出本地 git 分支是否存在?

    我正在使用以下命令来查明是否localgit 分支与branch name存在于我的存储库中 它是否正确 有没有更好的办法 请注意 我是在脚本内执行此操作 为此我想使用管道命令如果可能的话 git show ref verify quiet
  • Itextsharp:在一页上调整 2 个元素

    所以 我在使用 C NET 4 0 WinForms 和 iTextSharp 5 1 2 时遇到了这个问题 我在数据库中存储了一些扫描图像 需要使用这些图像即时构建 PDF 有些文件只有一页 而其他文件则有数百页 使用以下方法工作得很好
  • 错误:VB 运行时未加载

    根据社区的建议编辑版本 In a Windows 8 1电话项目 一部分VB Net还带有商店应用程序和可移植类库的解决方案 我收到此错误消息 由于未加载 VB 运行时 无法调用 但据我所知 尽管如此 代码仍在运行 直到 最终弹出一个错误
  • ForEach 方法后 PowerShell 长度的奇怪行为

    In 官方文件据说Length是一个别名Count 但是我发现他们的行为有所不同的一种情况 另外 如果我更换ForEach方法与ForEach Object the Length会发出 3 谁能解释一下吗 gt 1 3 ForEach Le
  • 使用 SBJSON 解析 Objective-C 中的 JSON

    我只想使用 SBJSON 框架在 Objective C 中解析这个 JSON 字符串 并检索三个数据单元 x 197 y 191 text this is a string 如何才能做到这一点 NSString jsonString x
  • 加快镜头的实时绘图 (cv2)

    我正在尝试使用 cv2 模块为视频的每一帧创建实时散点图 下面的代码正是这样做的 然而 对于包含超过 60000 个帧的超过 8 分钟的镜头需要处理 代码效率不高 并且需要比获得所需输出所需的时间更长的时间 vidcap cv2 Video
  • Rails 中命名范围的意义是什么?

    在了解详细信息之前 问题1 这里的范围是什么意思 即名为 范围 使用命名范围有什么好处 Now 摘自 Rails 敏捷开发 一书 class Order lt ActiveRecord Base named scope last n day
  • 检查 Cloud Firestore 中文档字段的特定值

    我想使用自定义用户名创建用户注册 我将用户的用户名存储在 Firestore 中的用户文档中 如何验证我的用户集合中已存在的用户名 也许有人已经有了用于反应式表单验证的片段 没有有效的方法来检查集合中所有文档的特定值 您必须依次阅读每个文档
  • 如何为同一 pandas Dataframe 中的所有不同列制作单独的 Seaborn kde 图?

    如何为 pandas 数据框的所有列制作两个单独的 Seaborn kde 图 一个熊猫数据框 df 有六列 例如下面 df columns A B C D E F 我尝试了以下代码 但没有成功 下面的代码有什么提示吗 df sns loa
  • 正则表达式 \b 但在 C# 中不仅仅包含字母数字字符

    我想要相同的功能 b但与其他角色 在 C 中 我想要类似的东西 string str b Regex Escape string b 不过我有一些所以Regex Escape Something 会在字符串中找到它Typing Someth
  • 逻辑 CPU 计数返回 16 而不是 4

    我有一个 Intel Core i5 2450m 2 个物理处理器和 4 个逻辑处理器 我想找到一种方法来计算 AMD 和 Intel CPU 上的逻辑和物理核心 但是 经过一番搜索 我发现了一些奇怪的事情 我的代码没有返回 4 个逻辑单元
  • 使用 tableView:moveRowAtIndexPath:toIndexPath: 方法后将新订单保存到核心数据

    我在 Swift iOS 应用程序中有一个 tableView 允许用户对行重新排序 点击 编辑 按钮 可以重新排序或删除行 然后重新点击 编辑 按钮 现在显示为 完成 以完成该过程 如果我只是使用 tableView moveRowAtI
  • __future__ 导入在幕后是如何工作的

    我一直着迷于 future 模块 特别是它能够改变 python 中语句的解析方式 最有趣的是如何做类似的事情 from future import print function 使您能够使用print 并不是print function