This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: SpooledTemporaryFile breakages
Type: behavior Stage: resolved
Components: Library (Lib) Versions: Python 3.1
process
Status: closed Resolution: duplicate
Dependencies: Superseder: SpooledTemporaryFile's name property is broken
View: 10355
Assigned To: Nosy List: danohuiginn, leonov, r.david.murray
Priority: normal Keywords: patch

Created on 2009-07-22 01:54 by leonov, last changed 2022-04-11 14:56 by admin. This issue is now closed.

Files
File name Uploaded Description Edit
name-and-mode-properties.diff leonov, 2009-07-22 22:27 Patch against SVN release31-maint review
really-broken-properties-methods.diff leonov, 2009-07-22 23:05 Test for broken properties in SpooledTemporaryFile review
Messages (4)
msg90789 - (view) Author: Leon Matthews (leonov) Date: 2009-07-22 01:54
According the docs for the tempfile module, SpooledTemporaryFile()
should operate "exactly as TemporaryFile() does".  However, while
playing around trying to learn the module I found a couple of places
where this is not the case: 

import tempfile

hello = bytes('Hello World!', encoding='utf-8')
tf = tempfile.TemporaryFile()
stf = tempfile.SpooledTemporaryFile()

tf.write(hello)
stf.write(hello)

# (1) Read after write behaviour differs...
>>> print(tf.read())  
b'Hello World'
>>> print(stf.read())
b''

# ...unless you seek first
>>> tf.seek(0)
>>> stf.seek(0)
>>> print(tf.read())
b'Hello World'
>>> print(stf.read())
b'Hello World'


# (2) Name attribute is fragile...
>>> print(tf.name)
3
print(stf.name)
AttributeError: '_io.BytesIO' object has no attribute 'name'

# ...until StringIO object replaced
stf.rollover()
print(stf.name)   # 4

I'm not sure if this should be categorised as a documentation or code
issue. In either case please be gentle -- I'm still just learning Python
(evaluating it as a [now likely] replacement for PHP for web application
development in our company).  I'm filing this bug because, as a
beginner, I was confused by the inconsistency between the docs and the
actual behaviour.

I'd be happy to try and write documentation and/or unit tests about
this, if somebody would be willing to review them for me... :-)
msg90828 - (view) Author: Leon Matthews (leonov) Date: 2009-07-22 22:27
I've attached a patch to SpooledTemporaryFile (and its test class) to
remove the suprising exceptions.

SpooledTemporaryFile uses a io.StringIO for storage (in self._file)
until it reaches a certain size (or rollover() is called), at which
point it switches to a file object (or _TemporaryFileWrapper on
non-posix platforms).  This implementation detail should be abstracted
away from the user.

The interface mismatch there which caused an AttributeError to be thrown
-- but only if the file size was new, or below a certain size.
msg90833 - (view) Author: Leon Matthews (leonov) Date: 2009-07-22 23:05
Some properties seem to be broken no matter if the underlying storage
system is file or StringIO.

Properties: encoding, newlines, and softspace

And the method: xreadlines()

I'm not sure what the correct behaviour should be (although I'm pretty
sure xreadlines() should just be deleted -- but when?), so I haven't
tried to patch the code.  The attached patch is a just (a beginners idea
of a) test to confirm the problem.
msg182456 - (view) Author: R. David Murray (r.david.murray) * (Python committer) Date: 2013-02-20 00:41
Thanks for the report, and sorry we didn't handle it when you reported it.  This issue was re-reported and fixed in issue #10355.
History
Date User Action Args
2022-04-11 14:56:51adminsetgithub: 50790
2013-02-20 00:41:55r.david.murraysetstatus: open -> closed

superseder: SpooledTemporaryFile's name property is broken

nosy: + r.david.murray
messages: + msg182456
resolution: duplicate
stage: resolved
2010-03-17 09:50:27danohuiginnsetnosy: + danohuiginn
2009-07-22 23:08:10leonovsettitle: SpooledTemporaryFile cleanups -> SpooledTemporaryFile breakages
2009-07-22 23:05:37leonovsetfiles: + really-broken-properties-methods.diff

messages: + msg90833
2009-07-22 22:59:09leonovsettitle: SpooledTemporaryFile Cleanups -> SpooledTemporaryFile cleanups
2009-07-22 22:30:13leonovsettitle: SpooledTemporaryFile operates differently to TemporaryFile -> SpooledTemporaryFile Cleanups
2009-07-22 22:27:37leonovsetfiles: + name-and-mode-properties.diff
keywords: + patch
messages: + msg90828
2009-07-22 01:54:22leonovcreate