[PyQt] Missing QIODevice::read overloads
Phil Thompson
phil at riverbankcomputing.com
Sun May 31 16:18:30 BST 2015
On 25/05/2015 9:40 pm, Florian Bruhin wrote:
> Hi,
>
> I noticed the following QIODevice overloads are missing in PyQt:
>
> qint64 QIODevice::read(char * data, qint64 maxSize)
> qint64 QIODevice::readLine(char * data, qint64 maxSize)
>
> only the following are available:
>
> QByteArray QIODevice::read(qint64 maxSize)
> QByteArray QIODevice::readLine(qint64 maxSize = 0)
>
> The issue with those is that it's impossible to check for errors:
>
> This function has no way of reporting errors; returning an empty
> QByteArray can mean either that no data was currently available
> for reading, or that an error occurred.
>
> The best workaround I found so far is to check if
> QIODevice::errorString is "Unknown error", but that's a hack...
>
> Maybe PyQt should provide the two other forms as well, when passing a
> mutable byte object (QByteArray/bytearray?) as first parameter?
I'm not sure what the best solution is. The reason the overloads are
missing is that, following the normal PyQt conventions, they would
return a str (Py2) or a bytes (Py3) but the signature would then be
indistinguishable from the overloads that return a QByteArray. Possible
solutions...
1. Give the overloads a different Python name.
2. Change the existing methods to raise an exception (maybe initially a
warning) on error.
3. Pass a mutable object as an argument. If all Python versions are
still to be supported (something I don't think matters for PyQt5) then
it would have to by a QByteArray, otherwise (if only Python v2.6 and
later is to be supported) then a bytearray would do.
Given my previously stated desire to make better use of Python
deprecation warnings and to correct old, bad design decisions, then I'm
inclined towards option 2.
Phil
More information about the PyQt
mailing list