From: Guido van Rossum Date: Wed, 10 Oct 2007 18:00:50 +0000 (+0000) Subject: Random changes having to do with readline() and bytes. X-Git-Tag: v3.0a2~340 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=feea0786a2f2d38b99c1867a4e6f53e8e764905b;p=python Random changes having to do with readline() and bytes. --- diff --git a/Lib/pickle.py b/Lib/pickle.py index f01c42833c..45e7a8e196 100644 --- a/Lib/pickle.py +++ b/Lib/pickle.py @@ -778,31 +778,17 @@ class Unpickler: The protocol version of the pickle is detected automatically, so no proto argument is needed. - The file-like object must have two methods, a read() method that - takes an integer argument, and a readline() method that requires no - arguments. Both methods should return a string. Thus file-like - object can be a file object opened for reading, a StringIO object, - or any other custom object that meets this interface. + The file-like object must have two methods, a read() method + that takes an integer argument, and a readline() method that + requires no arguments. Both methods should return bytes. + Thus file-like object can be a binary file object opened for + reading, a BytesIO object, or any other custom object that + meets this interface. """ - try: - self.readline = file.readline - except AttributeError: - self.file = file + self.readline = file.readline self.read = file.read self.memo = {} - def readline(self): - # XXX Slow but at least correct - b = bytes() - while True: - c = self.file.read(1) - if not c: - break - b += c - if c == b'\n': - break - return b - def load(self): """Read a pickled object representation from the open file. @@ -895,7 +881,8 @@ class Unpickler: dispatch[BININT2[0]] = load_binint2 def load_long(self): - self.append(int(str(self.readline()[:-1]), 0)) + val = self.readline()[:-1].decode("ascii") + self.append(int(val, 0)) dispatch[LONG[0]] = load_long def load_long1(self): @@ -1076,8 +1063,10 @@ class Unpickler: def find_class(self, module, name): # Subclasses may override this - module = str(module) - name = str(name) + if isinstance(module, bytes): + module = module.decode("utf-8") + if isinstance(name, bytes): + name = name.decode("utf-8") __import__(module) mod = sys.modules[module] klass = getattr(mod, name) @@ -1110,7 +1099,7 @@ class Unpickler: dispatch[DUP[0]] = load_dup def load_get(self): - self.append(self.memo[str8(self.readline())[:-1]]) + self.append(self.memo[str(self.readline())[:-1]]) dispatch[GET[0]] = load_get def load_binget(self):