[prev in list] [next in list] [prev in thread] [next in thread] 

List:       pykde
Subject:    Re: [PyQt] Missing QIODevice::read overloads
From:       Florian Bruhin <me () the-compiler ! org>
Date:       2015-05-31 16:03:59
Message-ID: 20150531160359.GE469 () tonks
[Download RAW message or body]

This is a MIME-formatted message.  If you see this text it means that your
E-mail software does not support MIME-formatted messages.

[Attachment #2 (multipart/signed)]
This is a MIME-formatted message.  If you see this text it means that your
E-mail software does not support MIME-formatted messages.


* Phil Thompson <phil@riverbankcomputing.com> [2015-05-31 16:18:30 +0100]:
> 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.

toothrot from the #pyqt IRC channel (who seems to read this ML)
actually told me PyQt seems to return None rather than an empty string
when there's an error.

From sip/QtCore/qiodevice.sip:

        virtual SIP_PYOBJECT readData(qint64 maxlen) = 0 \
/DocType="Py_v3:bytes;str",ReleaseGIL/ [qint64 (char *data, qint64 maxlen)];  \
%MethodCode  // Return the data read or None if there was an error.
            if (a0 < 0)
            {
                PyErr_SetString(PyExc_ValueError, "maximum length of data to be read \
cannot be negative");  sipIsErr = 1;
            }
            else
            {
                char *s = new char[a0];
                qint64 len;
            
                Py_BEGIN_ALLOW_THREADS
            #if defined(SIP_PROTECTED_IS_PUBLIC)
                len = sipCpp->readData(s, a0);
            #else
                len = sipCpp->sipProtect_readData(s, a0);
            #endif
                Py_END_ALLOW_THREADS
            
                if (len < 0)
                {
                    Py_INCREF(Py_None);
                    sipRes = Py_None;
                }
                else
                {
                    sipRes = SIPBytes_FromStringAndSize(s, len);
            
                    if (!sipRes)
                        sipIsErr = 1;
                }
            
                delete[] s;
            }
    %End


I'm actually fine with that solution, it means there *is* a way to
differentiate "no data" and "there was an error" from Python.

What's more problematic in my opinion is that we had to read the .sip
files to find out - [1] only links to the C++ documentation.

"There's almost no documentation for the classes" is actually
something I hear about PyQt and I tell them to stop worrying and just
read the C++ documentation - I see duplicating that makes no sense.

But at least for the cases where PyQt's signature/behaviour is
different from the Qt one, I think this should be documented
somewhere.

[1] http://pyqt.sourceforge.net/Docs/PyQt5/api/qiodevice.html

Florian

-- 
http://www.the-compiler.org | me@the-compiler.org (Mail/XMPP)
   GPG: 916E B0C8 FD55 A072 | http://the-compiler.org/pubkey.asc
         I love long mails! | http://email.is-not-s.ms/


[Attachment #5 (application/pgp-signature)]
[Attachment #6 (text/plain)]

_______________________________________________
PyQt mailing list    PyQt@riverbankcomputing.com
http://www.riverbankcomputing.com/mailman/listinfo/pyqt

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic