mirror of https://github.com/python/cpython.git
Let the default encodings search function lookup aliases before trying the codec import. This allows applications to install codecs which override (non-special-cased) builtin codecs.
This commit is contained in:
parent
5c94d33077
commit
c83dddf7fe
|
@ -27,7 +27,7 @@
|
||||||
|
|
||||||
"""#"
|
"""#"
|
||||||
|
|
||||||
import codecs, exceptions, types
|
import codecs, exceptions, types, aliases
|
||||||
|
|
||||||
_cache = {}
|
_cache = {}
|
||||||
_unknown = '--unknown--'
|
_unknown = '--unknown--'
|
||||||
|
@ -38,6 +38,7 @@
|
||||||
' '
|
' '
|
||||||
' '
|
' '
|
||||||
' ')
|
' ')
|
||||||
|
_aliases = aliases.aliases
|
||||||
|
|
||||||
class CodecRegistryError(exceptions.LookupError,
|
class CodecRegistryError(exceptions.LookupError,
|
||||||
exceptions.SystemError):
|
exceptions.SystemError):
|
||||||
|
@ -74,23 +75,31 @@ def search_function(encoding):
|
||||||
|
|
||||||
# Import the module:
|
# Import the module:
|
||||||
#
|
#
|
||||||
# First look in the encodings package, then try to lookup the
|
# First try to find an alias for the normalized encoding
|
||||||
# encoding in the aliases mapping and retry the import using the
|
# name and lookup the module using the aliased name, then try to
|
||||||
# default import module lookup scheme with the alias name.
|
# lookup the module using the standard import scheme, i.e. first
|
||||||
|
# try in the encodings package, then at top-level.
|
||||||
#
|
#
|
||||||
modname = normalize_encoding(encoding)
|
norm_encoding = normalize_encoding(encoding)
|
||||||
try:
|
aliased_encoding = _aliases.get(norm_encoding) or \
|
||||||
mod = __import__('encodings.' + modname,
|
_aliases.get(norm_encoding.replace('.', '_'))
|
||||||
globals(), locals(), _import_tail)
|
if aliased_encoding is not None:
|
||||||
except ImportError:
|
modnames = [aliased_encoding,
|
||||||
import aliases
|
norm_encoding]
|
||||||
modname = (aliases.aliases.get(modname) or
|
else:
|
||||||
aliases.aliases.get(modname.replace('.', '_')) or
|
modnames = [norm_encoding]
|
||||||
modname)
|
for modname in modnames:
|
||||||
|
if not modname:
|
||||||
|
continue
|
||||||
try:
|
try:
|
||||||
mod = __import__(modname, globals(), locals(), _import_tail)
|
mod = __import__(modname,
|
||||||
|
globals(), locals(), _import_tail)
|
||||||
except ImportError:
|
except ImportError:
|
||||||
mod = None
|
pass
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
mod = None
|
||||||
|
|
||||||
try:
|
try:
|
||||||
getregentry = mod.getregentry
|
getregentry = mod.getregentry
|
||||||
|
@ -125,10 +134,9 @@ def search_function(encoding):
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
import aliases
|
|
||||||
for alias in codecaliases:
|
for alias in codecaliases:
|
||||||
if not aliases.aliases.has_key(alias):
|
if not _aliases.has_key(alias):
|
||||||
aliases.aliases[alias] = modname
|
_aliases[alias] = modname
|
||||||
|
|
||||||
# Return the registry entry
|
# Return the registry entry
|
||||||
return entry
|
return entry
|
||||||
|
|
Loading…
Reference in New Issue