[Patches] [ python-Patches-608182 ] Enhanced file constructor

SourceForge.net noreply@sourceforge.net
Mon, 02 Jun 2003 21:47:22 -0700


Patches item #608182, was opened at 2002-09-11 20:45
Message generated for change (Comment added) made by bcannon
You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=305470&aid=608182&group_id=5470

Category: Core (C code)
Group: Python 2.3
Status: Open
Resolution: None
Priority: 5
Submitted By: Taral (taral)
Assigned to: Nobody/Anonymous (nobody)
Summary: Enhanced file constructor

Initial Comment:
This patch allows the file constructor to take a file
descriptor, allowing for  much easier extension of its
functionality.

----------------------------------------------------------------------

>Comment By: Brett Cannon (bcannon)
Date: 2003-06-02 21:47

Message:
Logged In: YES 
user_id=357491

You can use groups.google.com or python-list@python.org.

----------------------------------------------------------------------

Comment By: Taral (taral)
Date: 2003-06-02 12:33

Message:
Logged In: YES 
user_id=25129

No, I don't have usenet access.

----------------------------------------------------------------------

Comment By: Brett Cannon (bcannon)
Date: 2003-06-01 14:21

Message:
Logged In: YES 
user_id=357491

Has a discussion comp.lang.python occured to judge the demand for this 
feature?

----------------------------------------------------------------------

Comment By: Taral (taral)
Date: 2003-05-09 09:37

Message:
Logged In: YES 
user_id=25129

Okay, you have a good point. I could convert it to this format:

file(filename[, mode[, buffering[, fd]]])
or
file(filename[,mode[, buffering]][, fd=fd])

That should satisfy the type requirement. I kind of prefer
the keyword version, but that's just me.

I know about the containment solution, but I can't pass
containers to functions that expect isinstance(arg, file).

(As for os.popen, that's happens to be why I made this patch
in the first case. I needed to extend popen functionality,
and this was the minimum way to do it without violating the
above isinstance requirement.)

----------------------------------------------------------------------

Comment By: Tim Peters (tim_one)
Date: 2003-05-08 20:53

Message:
Logged In: YES 
user_id=31435

You do need to convince people it's a good idea.  I cringe 
for two reasons:  it mixes up a higher-level facility with a 
lower-level one; and, in a language with dynamic typing, it's 
*helpful* that file(xyz, 'w') raises TypeError today when the 
runtime type of xyz is an integer.  This catches a serious 
error before it can harm files.

I'd dislike losing that error detection more than I'd like the 
new facility this offers.  Perhaps I'm in a small minority, 
though, in which case a discussion on comp.lang.python 
could reveal that.  Someone there will point out that while 
you can't get what you want directly via subclassing file 
today, you can get the effect via containment and a 
__getattr__ hook (to delegate the file methods you don't 
want to intercept to the contained file object).  That covers 
cases this patch doesn't, too, such as file objects returned 
by os.popen() (i.e., even with this patch, there are still "file 
objects that CANNOT be subclassed").

----------------------------------------------------------------------

Comment By: Taral (taral)
Date: 2003-05-08 19:32

Message:
Logged In: YES 
user_id=25129

I have a very good reason! Without it, there are file
objects that CANNOT be subclassed, specifically those
created via os.fdopen.

Yes, I am _still_ waiting for this to go in. Do I need to do
something else on some mailing list to get people to notice it?

----------------------------------------------------------------------

Comment By: Brett Cannon (bcannon)
Date: 2003-05-08 18:09

Message:
Logged In: YES 
user_id=357491

This functionality has still not made it into 2.3b1 .  If no one speaks up and 
comes up with a good argument to apply this by May 15 I am going to reject 
this patch.

----------------------------------------------------------------------

Comment By: Taral (taral)
Date: 2003-01-31 12:12

Message:
Logged In: YES 
user_id=25129

Didn't make it into 2.3alpha?

----------------------------------------------------------------------

Comment By: Taral (taral)
Date: 2002-09-12 11:39

Message:
Logged In: YES 
user_id=25129

class some_class(file):
    def __init__(self, arg):
        fd = do_some_os_stuff_with_forks_and_pipes_or_sockets
        return file.__init__(self, fd, 'r')

    def close(self):
        do_some_cleanup_stuff
        return file.close(self)

and so on.

----------------------------------------------------------------------

Comment By: Martin v. Löwis (loewis)
Date: 2002-09-11 23:59

Message:
Logged In: YES 
user_id=21627

What's wrong with os.fdopen? Why is

f = file(10, "r")

much easier than

f = os.fdopen(10, "r")

----------------------------------------------------------------------

Comment By: Taral (taral)
Date: 2002-09-11 22:31

Message:
Logged In: YES 
user_id=25129

Okay, fixed it all. Passes 'make test' on linux/x86 with
default configure (does not test dbm/gdbm/mpz/bsddb).

(btw, old versions can be deleted)

----------------------------------------------------------------------

Comment By: Neal Norwitz (nnorwitz)
Date: 2002-09-11 21:10

Message:
Logged In: YES 
user_id=33168

fp's and fd's are not interchangable.  The variable should
be called fd, since it's an int.  fill_file_fields() 2nd arg
is a FILE*, not an int.  So you would need to do file =
fdopen(fd, mode), then pass file as the 2nd arg.  In order
for this patch to be accepted, a test would also need to be
added (see Lib/test/test_file.py) and doc should be updated
(see Doc/lib/libfuncs.tex).

----------------------------------------------------------------------

Comment By: Taral (taral)
Date: 2002-09-11 20:47

Message:
Logged In: YES 
user_id=25129

Bah, forgot the variable.

----------------------------------------------------------------------

You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=305470&aid=608182&group_id=5470