diff options
author | Raymond Hettinger <python@rcn.com> | 2011-06-26 12:29:35 (GMT) |
---|---|---|
committer | Raymond Hettinger <python@rcn.com> | 2011-06-26 12:29:35 (GMT) |
commit | 038018aaa4c4d1c8df7952adaa4df14ec3333496 (patch) | |
tree | 8b30de00744a81c33b9e8b2e01716a3ef513e144 | |
parent | 4850d52b4debbd8ed8ba6a41e697fa8fdaf7ae96 (diff) | |
download | cpython-038018aaa4c4d1c8df7952adaa4df14ec3333496.zip cpython-038018aaa4c4d1c8df7952adaa4df14ec3333496.tar.gz cpython-038018aaa4c4d1c8df7952adaa4df14ec3333496.tar.bz2 |
Issue #4608: urllib.request.urlopen does not return an iterable object
-rw-r--r-- | Lib/test/test_urllib.py | 5 | ||||
-rw-r--r-- | Lib/urllib/response.py | 12 | ||||
-rw-r--r-- | Misc/ACKS | 1 |
3 files changed, 12 insertions, 6 deletions
diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py index 7bb8a09..3a806bf 100644 --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -110,8 +110,9 @@ class urlopen_FileTests(unittest.TestCase): # Test iterator # Don't need to count number of iterations since test would fail the # instant it returned anything beyond the first line from the - # comparison - for line in self.returned_obj.__iter__(): + # comparison. + # Use the iterator in the usual implicit way to test for ticket #4608. + for line in self.returned_obj: self.assertEqual(line, self.text) class ProxyTests(unittest.TestCase): diff --git a/Lib/urllib/response.py b/Lib/urllib/response.py index 9859642..8c6dcca 100644 --- a/Lib/urllib/response.py +++ b/Lib/urllib/response.py @@ -23,10 +23,14 @@ class addbase(object): self.fileno = self.fp.fileno else: self.fileno = lambda: None - if hasattr(self.fp, "__iter__"): - self.__iter__ = self.fp.__iter__ - if hasattr(self.fp, "__next__"): - self.__next__ = self.fp.__next__ + + def __iter__(self): + # Assigning `__iter__` to the instance doesn't work as intended + # because the iter builtin does something like `cls.__iter__(obj)` + # and thus fails to find the _bound_ method `obj.__iter__`. + # Returning just `self.fp` works for built-in file objects but + # might not work for general file-like objects. + return iter(self.fp) def __repr__(self): return '<%s at %r whose fp = %r>' % (self.__class__.__name__, @@ -309,6 +309,7 @@ Lele Gaifax Santiago Gala Yitzchak Gale Quentin Gallet-Gilles +Riccardo Attilio Galli Raymund Galvin Nitin Ganatra Fred Gansevles |