Re: socket.makefile raises ValueError when mode = 'rt'

2013-01-09 Thread Dave Angel
On 01/09/2013 08:22 AM, Antoon Pardon wrote:
 This is using python 3.2.

 I am writing somekind of wrapper around the ftplib. So
 that you can work with it as if you are working with
 local files.

 The idea is that you start with making a connection like

 rmt = FTP(...)

 and then do something like the following

 rmtfl = rmt.open(rmtfilename, rt)
 for ln in rmtfl:
 treat(ln)

 This is part of the code:

 class ftpfile:
 def __init__(self, cn, rfn, mode, bound = False):
 self.ftp = cn
 self.bound = bound
 if 'b' in mode:
 self.ftp.voidcmd('TYPE I')
 else:
 self.ftp.voidcmd('TYPE A')
 if 'r' in mode:
 self.cnct =  self.ftp.transfercmd(RETR %s % rfn)
 self.fl = self.cnct.makefile(mode)
 elif 'w' in mode:
 self.cnct =  self.ftp.transfercmd(STOR %s % rfn)
 self.fl = self.cnct.makefile(mode, newline = '\r\n')
 else:
 raise ValueError(%s: invalide mode % mode)

 The problem is with makefile. If mode contains a t I get
 the following traceback:

 Traceback (most recent call last):
   File ftputil.tpy, line 14, in test_textftp
 rmtfl1 = rmt.open('ftp1.py', 'wt')
   File /local/home/apardon/src/projecten/py3lib/ftputil.py, line 76,
 in open
 return ftpfile(ftp, fn, mode, True)
   File /local/home/apardon/src/projecten/py3lib/ftputil.py, line 15,
 in __init__
 self.fl = self.cnct.makefile(mode, newline = '\r\n')
   File /usr/lib/python3.2/socket.py, line 151, in makefile
 raise ValueError(invalid mode %r (only r, w, b allowed))
 ValueError: invalid mode %r (only r, w, b allowed)

 But the documentation states:
 socket.makefile(mode='r', buffering=None, *, encoding=None, errors=None,
 newline=None)
 Return a file object associated with the socket. The exact returned
 type depends on the arguments given to makefile(). These arguments are
 interpreted the same way as by the built-in open() function.

 And since 't' is allowed in the mode of the built-in open() function I
 would consider this a bug.
 Unless I am missing something?

I believe that 't' was a new addition to mode, for Python 3.x So
perhaps the socket library hasn't kept consistent with it.

I don't really know the socket library.  Does it even support text
mode?  Does that make sense?  Remember that text mode means a different
thing in 3.x than it did in 2.x



-- 

DaveA

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: socket.makefile raises ValueError when mode = 'rt'

2013-01-09 Thread Antoon Pardon
Op 01/09/13 14:54, Dave Angel schreef:
 On 01/09/2013 08:22 AM, Antoon Pardon wrote:
 This is using python 3.2.
...
 But the documentation states:
 socket.makefile(mode='r', buffering=None, *, encoding=None, errors=None,
 newline=None)
 Return a file object associated with the socket. The exact returned
 type depends on the arguments given to makefile(). These arguments are
 interpreted the same way as by the built-in open() function.

 And since 't' is allowed in the mode of the built-in open() function I
 would consider this a bug.
 Unless I am missing something?
 I believe that 't' was a new addition to mode, for Python 3.x So
 perhaps the socket library hasn't kept consistent with it.

 I don't really know the socket library.  Does it even support text
 mode?  Does that make sense?  Remember that text mode means a different
 thing in 3.x than it did in 2.x
As far as I understand the code, it does support text. This is part of
the makefile method.

   def makefile(self, mode=r, buffering=None, *,
 encoding=None, errors=None, newline=None):

for c in mode:
if c not in {r, w, b}:
raise ValueError(invalid mode %r (only r, w, b allowed))
writing = w in mode
reading = r in mode or not writing
assert reading or writing
binary = b in mode
...
if binary:
return buffer
text = io.TextIOWrapper(buffer, encoding, errors, newline)
text.mode = mode
return text

So it seems that if the mode is not binary an io.TextIOWrapper is
returned. That indicates to me that
text mode is supported.

-- 
Antoon Pardon
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: socket.makefile raises ValueError when mode = 'rt'

2013-01-09 Thread Terry Reedy

On 1/9/2013 9:14 AM, Antoon Pardon wrote:

Op 01/09/13 14:54, Dave Angel schreef:

On 01/09/2013 08:22 AM, Antoon Pardon wrote:

This is using python 3.2.

...

But the documentation states:
socket.makefile(mode='r', buffering=None, *, encoding=None, errors=None,
newline=None)
 Return a file object associated with the socket. The exact returned
type depends on the arguments given to makefile(). These arguments are
interpreted the same way as by the built-in open() function.

And since 't' is allowed in the mode of the built-in open() function I
would consider this a bug.
Unless I am missing something?

I believe that 't' was a new addition to mode, for Python 3.x So
perhaps the socket library hasn't kept consistent with it.

I don't really know the socket library.  Does it even support text
mode?  Does that make sense?  Remember that text mode means a different
thing in 3.x than it did in 2.x

As far as I understand the code, it does support text. This is part of
the makefile method.

def makefile(self, mode=r, buffering=None, *,
  encoding=None, errors=None, newline=None):

 for c in mode:
 if c not in {r, w, b}:
 raise ValueError(invalid mode %r (only r, w, b allowed))
 writing = w in mode
 reading = r in mode or not writing
 assert reading or writing
 binary = b in mode
 ...
 if binary:
 return buffer
 text = io.TextIOWrapper(buffer, encoding, errors, newline)
 text.mode = mode
 return text

So it seems that if the mode is not binary an io.TextIOWrapper is
returned. That indicates to me that
text mode is supported.


The doc does not specify any limit on mode, though the exclusions 'a', 
'+', 'x', and 'U' seem proper to me. That contradicts the mode check. 
The exclusion of of 't' (which is the default, in that 'b' must be 
explicitly given to have effect) contradicts the later code. I think you 
should open an issue on the tracker suggesting that 't' be added to the 
mode check and that the doc mention the remaining mode limitation.


In the meanwhile, your ftpfile.__init__ could remove t from the mode 
before passing it on.



--
Terry Jan Reedy

--
http://mail.python.org/mailman/listinfo/python-list