"from __future__ import braces"代码在哪里?

Eli*_*sha 54 python python-2.7 python-internals

我想知道在命令上执行的代码究竟是什么:

>>> from __future__ import braces
SyntaxError: not a chance
Run Code Online (Sandbox Code Playgroud)

所以,因为python是开源的,我打开C:\Python27\Lib\__future__.py并查看.令人惊讶的是,我发现没有处理导入braces模块的东西.

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

Pet*_*vaz 65

代码在将来.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;
  }
Run Code Online (Sandbox Code Playgroud)

  • 值得解释一下:`from __future__ import foo`不是import语句,它是[future statement](http://docs.python.org/3.3/reference/simple_stmts.html#future-statements).CPython编译器通过首先从`future.c`调用适当的代码来处理它,并且_then_将其视为`import`.其他编译器也会做类似的事情. (44认同)
  • 万一有人好奇,PyPy 2.1实际上在处理[`codegen.PythonCodeGenerator.visit_ImportFrom`之前,甚至在获取正常的`future`语句代码之前,专门处理`from __future__ import braces`(或包含`braces`的逗号分隔列表). ](https://bitbucket.org/pypy/pypy/src/28108772614ab96ecc6f16ac3a7b8fd0da31e61b/pypy/interpreter/astcompiler/codegen.py?at=default#cl-629). (9认同)
  • 我想补充一点,拒绝大括号的代码是用大括号编写的,这真是太搞笑了。 (5认同)
  • Python是一种好客的语言:"不是偶然的". (2认同)