Issue #19619: Blacklist non-text codecs in method API · python/cpython@c72e4e6 · GitHub
Skip to content

Commit c72e4e6

Browse files
committed
Issue #19619: Blacklist non-text codecs in method API
str.encode, bytes.decode and bytearray.decode now use an internal API to throw LookupError for known non-text encodings, rather than attempting the encoding or decoding operation and then throwing a TypeError for an unexpected output type. The latter mechanism remains in place for third party non-text encodings.
1 parent 322f5ba commit c72e4e6

13 files changed

Lines changed: 285 additions & 87 deletions

File tree

Include/codecs.h

Lines changed: 27 additions & 0 deletions

Lib/codecs.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,19 @@
7373
### Codec base classes (defining the API)
7474

7575
class CodecInfo(tuple):
76+
"""Codec details when looking up the codec registry"""
77+
78+
# Private API to allow Python 3.4 to blacklist the known non-Unicode
79+
# codecs in the standard library. A more general mechanism to
80+
# reliably distinguish test encodings from other codecs will hopefully
81+
# be defined for Python 3.5
82+
#
83+
# See http://bugs.python.org/issue19619
84+
_is_text_encoding = True # Assume codecs are text encodings by default
7685

7786
def __new__(cls, encode, decode, streamreader=None, streamwriter=None,
78-
incrementalencoder=None, incrementaldecoder=None, name=None):
87+
incrementalencoder=None, incrementaldecoder=None, name=None,
88+
*, _is_text_encoding=None):
7989
self = tuple.__new__(cls, (encode, decode, streamreader, streamwriter))
8090
self.name = name
8191
self.encode = encode
@@ -84,6 +94,8 @@ def __new__(cls, encode, decode, streamreader=None, streamwriter=None,
8494
self.incrementaldecoder = incrementaldecoder
8595
self.streamwriter = streamwriter
8696
self.streamreader = streamreader
97+
if _is_text_encoding is not None:
98+
self._is_text_encoding = _is_text_encoding
8799
return self
88100

89101
def __repr__(self):

Lib/encodings/base64_codec.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,4 +52,5 @@ def getregentry():
5252
incrementaldecoder=IncrementalDecoder,
5353
streamwriter=StreamWriter,
5454
streamreader=StreamReader,
55+
_is_text_encoding=False,
5556
)

Lib/encodings/bz2_codec.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,4 +74,5 @@ def getregentry():
7474
incrementaldecoder=IncrementalDecoder,
7575
streamwriter=StreamWriter,
7676
streamreader=StreamReader,
77+
_is_text_encoding=False,
7778
)

Lib/encodings/hex_codec.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,4 +52,5 @@ def getregentry():
5252
incrementaldecoder=IncrementalDecoder,
5353
streamwriter=StreamWriter,
5454
streamreader=StreamReader,
55+
_is_text_encoding=False,
5556
)

Lib/encodings/quopri_codec.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,4 +53,5 @@ def getregentry():
5353
incrementaldecoder=IncrementalDecoder,
5454
streamwriter=StreamWriter,
5555
streamreader=StreamReader,
56+
_is_text_encoding=False,
5657
)

Lib/encodings/rot_13.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ def getregentry():
4343
incrementaldecoder=IncrementalDecoder,
4444
streamwriter=StreamWriter,
4545
streamreader=StreamReader,
46+
_is_text_encoding=False,
4647
)
4748

4849
### Map

Lib/encodings/uu_codec.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,4 +96,5 @@ def getregentry():
9696
incrementaldecoder=IncrementalDecoder,
9797
streamreader=StreamReader,
9898
streamwriter=StreamWriter,
99+
_is_text_encoding=False,
99100
)

Lib/encodings/zlib_codec.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,4 +74,5 @@ def getregentry():
7474
incrementaldecoder=IncrementalDecoder,
7575
streamreader=StreamReader,
7676
streamwriter=StreamWriter,
77+
_is_text_encoding=False,
7778
)

Lib/test/test_codecs.py

Lines changed: 108 additions & 68 deletions

0 commit comments

Comments
 (0)