mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
SF patch #1438387, PEP 328: relative and absolute imports.
- IMPORT_NAME takes an extra argument from the stack: the relativeness of the import. Only passed to __import__ when it's not -1. - __import__() takes an optional 5th argument for the same thing; it __defaults to -1 (old semantics: try relative, then absolute) - 'from . import name' imports name (be it module or regular attribute) from the current module's *package*. Likewise, 'from .module import name' will import name from a sibling to the current module. - Importing from outside a package is not allowed; 'from . import sys' in a toplevel module will not work, nor will 'from .. import sys' in a (single-level) package. - 'from __future__ import absolute_import' will turn on the new semantics for import and from-import: imports will be absolute, except for from-import with dots. Includes tests for regular imports and importhooks, parser changes and a NEWS item, but no compiler-package changes or documentation changes.
This commit is contained in:
parent
d3188639c3
commit
f7f438ba3b
20 changed files with 270 additions and 73 deletions
|
@ -2452,10 +2452,22 @@ compiler_import(struct compiler *c, stmt_ty s)
|
|||
XXX Perhaps change the representation to make this case simpler?
|
||||
*/
|
||||
int i, n = asdl_seq_LEN(s->v.Import.names);
|
||||
|
||||
for (i = 0; i < n; i++) {
|
||||
alias_ty alias = asdl_seq_GET(s->v.Import.names, i);
|
||||
int r;
|
||||
PyObject *level;
|
||||
|
||||
if (c->c_flags && (c->c_flags->cf_flags & CO_FUTURE_ABSIMPORT))
|
||||
level = PyInt_FromLong(0);
|
||||
else
|
||||
level = PyInt_FromLong(-1);
|
||||
|
||||
if (level == NULL)
|
||||
return 0;
|
||||
|
||||
ADDOP_O(c, LOAD_CONST, level, consts);
|
||||
Py_DECREF(level);
|
||||
ADDOP_O(c, LOAD_CONST, Py_None, consts);
|
||||
ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
|
||||
|
||||
|
@ -2488,9 +2500,22 @@ compiler_from_import(struct compiler *c, stmt_ty s)
|
|||
int i, n = asdl_seq_LEN(s->v.ImportFrom.names);
|
||||
|
||||
PyObject *names = PyTuple_New(n);
|
||||
PyObject *level;
|
||||
|
||||
if (!names)
|
||||
return 0;
|
||||
|
||||
if (s->v.ImportFrom.level == 0 && c->c_flags &&
|
||||
!(c->c_flags->cf_flags & CO_FUTURE_ABSIMPORT))
|
||||
level = PyInt_FromLong(-1);
|
||||
else
|
||||
level = PyInt_FromLong(s->v.ImportFrom.level);
|
||||
|
||||
if (!level) {
|
||||
Py_DECREF(names);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* build up the names */
|
||||
for (i = 0; i < n; i++) {
|
||||
alias_ty alias = asdl_seq_GET(s->v.ImportFrom.names, i);
|
||||
|
@ -2509,6 +2534,8 @@ compiler_from_import(struct compiler *c, stmt_ty s)
|
|||
}
|
||||
}
|
||||
|
||||
ADDOP_O(c, LOAD_CONST, level, consts);
|
||||
Py_DECREF(level);
|
||||
ADDOP_O(c, LOAD_CONST, names, consts);
|
||||
Py_DECREF(names);
|
||||
ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue