diff options
author | Tim Peters <tim.peters@gmail.com> | 2001-10-16 20:18:24 (GMT) |
---|---|---|
committer | Tim Peters <tim.peters@gmail.com> | 2001-10-16 20:18:24 (GMT) |
commit | c993315b188b08b6d78248522f6d0ed31d52f939 (patch) | |
tree | 3fd0205ab57b86f588c32a378186c3569ad1d9ed /Lib | |
parent | dfefc06fe01fdab0171a368c642ecaf352540627 (diff) | |
download | cpython-c993315b188b08b6d78248522f6d0ed31d52f939.zip cpython-c993315b188b08b6d78248522f6d0ed31d52f939.tar.gz cpython-c993315b188b08b6d78248522f6d0ed31d52f939.tar.bz2 |
SF bug [#468061] __str__ ignored in str subclass.
object.c, PyObject_Str: Don't try to optimize anything except exact
string objects here; in particular, let str subclasses go thru tp_str,
same as non-str objects. This allows overrides of tp_str to take
effect.
stringobject.c:
+ string_print (str's tp_print): If the argument isn't an exact string
object, get one from PyObject_Str.
+ string_str (str's tp_str): Make a genuine-string copy of the object if
it's of a proper str subclass type. str() applied to a str subclass
that doesn't override __str__ ends up here.
test_descr.py: New str_of_str_subclass() test.
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/test/test_descr.py | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index a15e7a0..c9235c8 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -2298,6 +2298,36 @@ def buffer_inherit(): except TypeError: pass +def str_of_str_subclass(): + import binascii + import cStringIO + + if verbose: + print "Testing __str__ defined in subclass of str ..." + + class octetstring(str): + def __str__(self): + return binascii.b2a_hex(self) + def __repr__(self): + return self + " repr" + + o = octetstring('A') + vereq(type(o), octetstring) + vereq(type(str(o)), str) + vereq(type(repr(o)), str) + vereq(ord(o), 0x41) + vereq(str(o), '41') + vereq(repr(o), 'A repr') + vereq(o.__str__(), '41') + vereq(o.__repr__(), 'A repr') + + capture = cStringIO.StringIO() + # Calling str() or not exercises different internal paths. + print >> capture, o + print >> capture, str(o) + vereq(capture.getvalue(), '41\n41\n') + capture.close() + def test_main(): class_docstrings() lists() @@ -2346,6 +2376,7 @@ def test_main(): binopoverride() subclasspropagation() buffer_inherit() + str_of_str_subclass() if verbose: print "All OK" if __name__ == "__main__": |