[Python-ideas] socket.sendall() "counter" parameter

Giampaolo Rodola' g.rodola at gmail.com
Fri Apr 18 14:28:22 CEST 2014


On Fri, Apr 18, 2014 at 2:04 PM, Antoine Pitrou <solipsis at pitrou.net> wrote:

> On Fri, 18 Apr 2014 13:34:45 +0200
> "Giampaolo Rodola'" <g.rodola at gmail.com>
> wrote:
> > With current socket.sendall() implementation if an error occurs it's
> > impossible to tell how much data was sent. As such I'm wondering whether
> it
> > would make sense to add a "counter" parameter which gets incremented
> > internally:
> >
> > sent = 0
> > try:
> >      sock.sendall(data, counter=sent)
> > except socket.error as err:
> >      priint("only %s bytes were sent" % sent)
> >
> > This would both allow to not lose information on error and avoid keeping
> > track of the total data being sent, which usually requires and extra
> len()
> > call. E.g. when sending a file:
> >
> > file = open('somefile', 'rb')
> > total = 0
> > while True:
> >     chunk = file.read(8192)
> >     if not chunk:
> >         break
> >     sock.sendall(chunk, counter=total)
>
> Why not simply use send() in such cases?
> (or, if you want something file-like, call makefile() and then write())
>
> Regards
>
> Antoine.


send() requires to keep track of how much data has actually been sent,
hence you need to add some additional logic to resend the missing (tail)
part (e.g.:
http://hg.python.org/cpython/file/7433f7bce880/Lib/asyncio/unix_events.py#l389
).
That is is fine, but also a bit annoying when you're lazy and grumpy like
me.  ;-)
Actually what would really be useful for sendall() in order to be as
"nicer" as possible in terms of usability would be to:

1 - return the number of bytes sent instead of None; that would spare you
from using "total += len(data)" on every iteration.

2 - in case of error set a "sent" attribute to the returned (socket.error)
exception.

I'm not sure how #2 is feasible in practice though nor if it's acceptable
to have only certain socket.error exceptions providing extra attributes.

-- 
Giampaolo - http://grodola.blogspot.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20140418/7a33aa68/attachment-0001.html>


More information about the Python-ideas mailing list