Re: socket.makefile raises ValueError when mode = 'rt'
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'
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'
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