-
Notifications
You must be signed in to change notification settings - Fork 59
Description
Hi there,
Diesel seems a really interesting project, such a shame it is not available for python3 !
So I've forked the repo (https://github.com/touilleMan/diesel/tree/py3k) and started to port the code ;-)
So far, all the tests are passing for Python 2.6, 2.7, 3.3 and 3.4 using the same codebase, but it seems those tests are not really exhaustive and there is still some work to do !
Now I'm trying to make work all the examples available.
My main point of concern is how to handle the strings:
- in Python2,
stris an array of bytes (bytestype is an alias ofstr), to use unicode we must isunicodetype - in Python3,
stris an array of unicodes characters and onlybytesan array of bytes
Considering Diesel, all the code is using classical str types (i.e. array of bytes), this seems pretty logical to me given there is no standard way to determine the encoding of data coming from a socket.
The downside of this is to make the code compatible with Python3, all the strings needs to be explicitly converted to bytes, leading to a lot of small changes, an code more complex (numerous conversions unicode => bytes).
Example:
# Python2 only
send('AUTH', self.password)
send("HTTP/%s %s %s\r\n" % (('%s.%s' % version), resp.status_code, resp.status))
# Python2&3
send(b'AUTH', self.password.encode())
send(("HTTP/%s %s %s\r\n" % (('%s.%s' % version), resp.status_code, resp.status)).encode())I've started to see if the core.send/core.receive function could be used to handle encoding, but - although it would be a nice solution - I don't believe this could lead to a easy drop-in replacement.
def send(data, priority=5, encoding='ascii'):
if isinstance(data, builtins.str):
data = data.encode(encoding)
return current_loop.send(data, priority=priority)
def receive(spec=None, encoding='ascii'):
data = current_loop.input_op(spec)
if isinstance(data, builtins.bytes):
data = data.decode(encoding)
return dataDo you have any advice/idea about the best way to handle this ?