“from __future__ import braces” 代码在哪里?

73

我在想,究竟是哪段代码在执行以下命令:

>>> from __future__ import braces
SyntaxError: not a chance

由于Python是开源的,我打开了C:\Python27\Lib\__future__.py并查看了一下。

令人惊讶的是,我发现那里没有处理导入braces模块的代码。

所以,我的问题是,处理这个的代码在哪里?当我运行该命令时会发生什么?

1个回答

83
代码在 future.c 文件中。
future_check_features(PyFutureFeatures *ff, stmt_ty s, const char *filename)
...
  else if (strcmp(feature, "braces") == 0) {
    PyErr_SetString(PyExc_SyntaxError,
        "not a chance");
    PyErr_SyntaxLocation(filename, s->lineno);
    return 0;
  }

52
值得进一步解释:from __future__ import foo 不是一个导入语句,而是一个未来语句。CPython编译器通过首先从 future.c 调用适当的代码,然后再将其视为一个 import 语句来处理它。其他编译器也会做类似的事情。 - abarnert
我已将链接从已死的svn存储库更改为当前的hg存储库。(这也将其更改为链接到3.4代码而不是2.6,但您可以通过在URL中替换分支标记为“2.7”或任何其他版本来找到2.7版本。) - abarnert
10
如果有人好奇,PyPy 2.1实际上在处理from __future__ import braces(或包括braces的逗号分隔列表)时会特别处理,在执行正常的future语句代码之前,在codegen.PythonCodeGenerator.visit_ImportFrom中。 - abarnert
3
Python是一门友好的语言:“不可能”。 - WestCoastProjects
5
我想补充一下,拒绝使用大括号的代码却是用大括号编写的,这真是相当高级幽默。 - Paul
1
活跃的 Github 存储库上的文件:https://github.com/python/cpython/blob/main/Python/future.c - lavalade

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接