Author: Armin Rigo <[email protected]>
Branch:
Changeset: r49304:6f2534aea5ca
Date: 2011-11-11 13:59 +0100
http://bitbucket.org/pypy/pypy/changeset/6f2534aea5ca/
Log: Obscure: mark some builtin modules (but not others) as taking
precedence in an "import xyz" statement if there is a file "xyz.py".
The exact list is copied from the default installation of CPython
2.7 on a recent Ubuntu Linux.
diff --git a/pypy/interpreter/mixedmodule.py b/pypy/interpreter/mixedmodule.py
--- a/pypy/interpreter/mixedmodule.py
+++ b/pypy/interpreter/mixedmodule.py
@@ -13,6 +13,7 @@
applevel_name = None
expose__file__attribute = True
+ cannot_override_in_import_statements = False
# The following attribute is None as long as the module has not been
# imported yet, and when it has been, it is mod.__dict__.items() just
diff --git a/pypy/module/__builtin__/__init__.py
b/pypy/module/__builtin__/__init__.py
--- a/pypy/module/__builtin__/__init__.py
+++ b/pypy/module/__builtin__/__init__.py
@@ -7,6 +7,7 @@
class Module(MixedModule):
"""Built-in functions, exceptions, and other objects."""
+ cannot_override_in_import_statements = True
expose__file__attribute = False
appleveldefs = {
diff --git a/pypy/module/_ast/__init__.py b/pypy/module/_ast/__init__.py
--- a/pypy/module/_ast/__init__.py
+++ b/pypy/module/_ast/__init__.py
@@ -3,6 +3,7 @@
class Module(MixedModule):
+ cannot_override_in_import_statements = True
interpleveldefs = {
"PyCF_ONLY_AST" : "space.wrap(%s)" % consts.PyCF_ONLY_AST,
diff --git a/pypy/module/_codecs/__init__.py b/pypy/module/_codecs/__init__.py
--- a/pypy/module/_codecs/__init__.py
+++ b/pypy/module/_codecs/__init__.py
@@ -37,6 +37,7 @@
Copyright (c) Corporation for National Research Initiatives.
"""
+ cannot_override_in_import_statements = True
appleveldefs = {}
diff --git a/pypy/module/_sre/__init__.py b/pypy/module/_sre/__init__.py
--- a/pypy/module/_sre/__init__.py
+++ b/pypy/module/_sre/__init__.py
@@ -1,6 +1,7 @@
from pypy.interpreter.mixedmodule import MixedModule
class Module(MixedModule):
+ cannot_override_in_import_statements = True
appleveldefs = {
}
diff --git a/pypy/module/_warnings/__init__.py
b/pypy/module/_warnings/__init__.py
--- a/pypy/module/_warnings/__init__.py
+++ b/pypy/module/_warnings/__init__.py
@@ -3,6 +3,7 @@
class Module(MixedModule):
"""provides basic warning filtering support.
It is a helper module to speed up interpreter start-up."""
+ cannot_override_in_import_statements = True
interpleveldefs = {
'warn' : 'interp_warnings.warn',
diff --git a/pypy/module/_weakref/__init__.py b/pypy/module/_weakref/__init__.py
--- a/pypy/module/_weakref/__init__.py
+++ b/pypy/module/_weakref/__init__.py
@@ -1,6 +1,7 @@
from pypy.interpreter.mixedmodule import MixedModule
class Module(MixedModule):
+ cannot_override_in_import_statements = True
appleveldefs = {
}
interpleveldefs = {
diff --git a/pypy/module/errno/__init__.py b/pypy/module/errno/__init__.py
--- a/pypy/module/errno/__init__.py
+++ b/pypy/module/errno/__init__.py
@@ -16,6 +16,7 @@
To map error codes to error messages, use the function os.strerror(),
e.g. os.strerror(2) could return 'No such file or directory'."""
+ cannot_override_in_import_statements = True
appleveldefs = {}
interpleveldefs = {"errorcode": "interp_errno.get_errorcode(space)"}
diff --git a/pypy/module/exceptions/__init__.py
b/pypy/module/exceptions/__init__.py
--- a/pypy/module/exceptions/__init__.py
+++ b/pypy/module/exceptions/__init__.py
@@ -2,6 +2,8 @@
from pypy.interpreter.mixedmodule import MixedModule
class Module(MixedModule):
+ cannot_override_in_import_statements = True
+
appleveldefs = {}
interpleveldefs = {
diff --git a/pypy/module/gc/__init__.py b/pypy/module/gc/__init__.py
--- a/pypy/module/gc/__init__.py
+++ b/pypy/module/gc/__init__.py
@@ -1,6 +1,7 @@
from pypy.interpreter.mixedmodule import MixedModule
class Module(MixedModule):
+ cannot_override_in_import_statements = True
appleveldefs = {
'enable': 'app_gc.enable',
'disable': 'app_gc.disable',
diff --git a/pypy/module/imp/__init__.py b/pypy/module/imp/__init__.py
--- a/pypy/module/imp/__init__.py
+++ b/pypy/module/imp/__init__.py
@@ -5,6 +5,7 @@
This module provides the components needed to build your own
__import__ function.
"""
+ cannot_override_in_import_statements = True
interpleveldefs = {
'PY_SOURCE': 'space.wrap(importing.PY_SOURCE)',
'PY_COMPILED': 'space.wrap(importing.PY_COMPILED)',
diff --git a/pypy/module/imp/importing.py b/pypy/module/imp/importing.py
--- a/pypy/module/imp/importing.py
+++ b/pypy/module/imp/importing.py
@@ -5,6 +5,7 @@
import sys, os, stat
from pypy.interpreter.module import Module
+from pypy.interpreter.mixedmodule import MixedModule
from pypy.interpreter.gateway import interp2app, unwrap_spec
from pypy.interpreter.typedef import TypeDef, generic_new_descr
from pypy.interpreter.error import OperationError, operationerrfmt
@@ -483,10 +484,19 @@
# XXX Check for frozen modules?
# when w_path is a string
+ default_result = None
+
if w_path is None:
# check the builtin modules
- if modulename in space.builtin_modules:
- return FindInfo(C_BUILTIN, modulename, None)
+ w_mod = space.builtin_modules.get(modulename, None)
+ if w_mod is not None:
+ default_result = FindInfo(C_BUILTIN, modulename, None)
+ mod = space.interpclass_w(w_mod)
+ if (isinstance(mod, MixedModule) and
+ mod.cannot_override_in_import_statements):
+ return default_result
+ #else:
+ # continue looking and only return it if no xxx.py found
w_path = space.sys.get('path')
# XXX check frozen modules?
@@ -530,7 +540,7 @@
# Out of file descriptors.
# not found
- return None
+ return default_result
def _prepare_module(space, w_mod, filename, pkgdir):
w = space.wrap
diff --git a/pypy/module/imp/test/test_import.py
b/pypy/module/imp/test/test_import.py
--- a/pypy/module/imp/test/test_import.py
+++ b/pypy/module/imp/test/test_import.py
@@ -918,6 +918,34 @@
finally:
stream.close()
+ def test_cannot_hide_builtin_exceptions(self):
+ import sys, os
+ filename = os.path.join(sys.path[0], 'exceptions.py')
+ f = open(filename, 'w')
+ f.close()
+ try:
+ import exceptions
+ assert hasattr(exceptions, 'NotImplementedError')
+ finally:
+ os.unlink(filename)
+
+ def test_can_hide_builtin_parser(self):
+ import sys, os
+ filename = os.path.join(sys.path[0], 'parser.py')
+ f = open(filename, 'w')
+ f.write('I_have_been_hidden = 42\n')
+ f.close()
+ old = sys.modules.pop('parser', None)
+ try:
+ import parser
+ assert hasattr(parser, 'I_have_been_hidden')
+ finally:
+ os.unlink(filename)
+ if old is not None:
+ sys.modules['parser'] = old
+ else:
+ del sys.modules['parser']
+
def test_PYTHONPATH_takes_precedence(space):
if sys.platform == "win32":
diff --git a/pypy/module/marshal/__init__.py b/pypy/module/marshal/__init__.py
--- a/pypy/module/marshal/__init__.py
+++ b/pypy/module/marshal/__init__.py
@@ -5,6 +5,7 @@
"""
This module implements marshal at interpreter level.
"""
+ cannot_override_in_import_statements = True
appleveldefs = {
}
diff --git a/pypy/module/posix/__init__.py b/pypy/module/posix/__init__.py
--- a/pypy/module/posix/__init__.py
+++ b/pypy/module/posix/__init__.py
@@ -30,6 +30,7 @@
disguised Unix interface). Refer to the library manual and
corresponding Unix manual entries for more information on calls."""
+ cannot_override_in_import_statements = True
applevel_name = os.name
appleveldefs = {
diff --git a/pypy/module/pwd/__init__.py b/pypy/module/pwd/__init__.py
--- a/pypy/module/pwd/__init__.py
+++ b/pypy/module/pwd/__init__.py
@@ -11,6 +11,7 @@
The uid and gid items are integers, all others are strings. An
exception is raised if the entry asked for cannot be found.
"""
+ cannot_override_in_import_statements = True
interpleveldefs = {
'getpwuid': 'interp_pwd.getpwuid',
diff --git a/pypy/module/signal/__init__.py b/pypy/module/signal/__init__.py
--- a/pypy/module/signal/__init__.py
+++ b/pypy/module/signal/__init__.py
@@ -4,6 +4,7 @@
import signal as cpy_signal
class Module(MixedModule):
+ cannot_override_in_import_statements = True
interpleveldefs = {
'signal': 'interp_signal.signal',
'getsignal': 'interp_signal.getsignal',
diff --git a/pypy/module/sys/__init__.py b/pypy/module/sys/__init__.py
--- a/pypy/module/sys/__init__.py
+++ b/pypy/module/sys/__init__.py
@@ -8,6 +8,7 @@
class Module(MixedModule):
"""Sys Builtin Module. """
_immutable_fields_ = ["defaultencoding?"]
+ cannot_override_in_import_statements = True
def __init__(self, space, w_name):
"""NOT_RPYTHON""" # because parent __init__ isn't
diff --git a/pypy/module/thread/__init__.py b/pypy/module/thread/__init__.py
--- a/pypy/module/thread/__init__.py
+++ b/pypy/module/thread/__init__.py
@@ -3,6 +3,8 @@
from pypy.interpreter.mixedmodule import MixedModule
class Module(MixedModule):
+ cannot_override_in_import_statements = True
+
appleveldefs = {
}
diff --git a/pypy/module/zipimport/__init__.py
b/pypy/module/zipimport/__init__.py
--- a/pypy/module/zipimport/__init__.py
+++ b/pypy/module/zipimport/__init__.py
@@ -5,6 +5,7 @@
from pypy.interpreter.mixedmodule import MixedModule
class Module(MixedModule):
+ cannot_override_in_import_statements = True
interpleveldefs = {
'zipimporter':'interp_zipimport.W_ZipImporter',
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit