[PyQt] PyQt/PyCharm/PEP problem with PyQt types
J Barchan
jnbarchan at gmail.com
Wed Nov 22 10:13:24 GMT 2017
@Florian & @Phil,
Your posts crossed with my last one above.
Technically as I wrote there, one does *not* have to "go through Qt reading
whether a "QObject *" does or does not accept NULL/None, because it
automatically *does*. As I wrote, if it does *not*, the correct Qt C++
declaration would have been "QObject &", and that was up to the Qt people,
not PyQt to guess.
Having said that, I realise we are where we are. (Unless PyQt wants to
change the declarations at the next release.) I am concerned about what I
can do moving on. You guys have clarified to me that I am not "missing
something" which would have solved this neatly. I now can declare *my own*
function parameters/returns with Union; I am stuck with where a PyQt
function does not do so and so I will get a warning on my calling code, but
at least I know where I am. So thank you all.
On 22 November 2017 at 10:03, Florian Bruhin <me at the-compiler.org> wrote:
> On Wed, Nov 22, 2017 at 09:38:21AM +0000, J Barchan wrote:
> > Thank you both, for the same solution. I had noticed the Union[QWidget,
> > None] construct and wondered if that was the only way/what I'm supposed
> to
> > do in Python. But it raises two questions, *and only solves one of the
> two
> > problems*:
>
> As mentioned in an earlier reply, there's Optional[QWidget] which is a
> shorthand for that.
>
> > 1. I am "surprised" at the need to do this from Python every time an
> object
> > might have value None. It's "cumbersome" compared to the way NULL/0 is
> > handled from C++, where it's always an acceptable value for any Object*
> > parameter/return value. Do you guys really write that for every place
> None
> > is acceptable?
>
> Yes, and it's probably the more correct way, because the caller code *has*
> to
> deal with the value being None.
>
> > 2. The problem is unsolved where a *PyQt* function accepts/returns None.
> > The second example I gave is calling QWidget.setParent(None). The
> > declaration of this in QtWidgets.pyi is:
> >
> > def setParent(self, parent: 'QWidget') -> None:
> >
> > Following your solutions, this *ought* to have been:
> >
> > def setParent(self, parent: typing.Union['QWidget', None]) -> None:
> >
> > But the problem is that it *isn't* defined like that in the .pyi, and I
> > can't help that. And it's not just that function, it's lots of others
> too
> > which accept or return None, so this issue keeps arising in my calling
> > code. Was it PyQt's job to recognise this and generate a different
> > declaration or what? Given where we are, I don't see any way of avoiding
> > the warning when calling such a PyQt function with None, do you?
>
> Yes, PyQt should use Optional[QWidget] here. However, there's probably no
> way
> for PyQt to know where None is acceptable and where it isn't...
>
> FWIW last time I looked at PyQt's type definitions, they were mostly
> intended
> for IDE documentation, and not for typechecking - and mypy (probably the
> most
> widely used type checking tool) didn't like the files at all.
>
> Florian
>
> --
> https://www.qutebrowser.org | me at the-compiler.org (Mail/XMPP)
> GPG: 916E B0C8 FD55 A072 | https://the-compiler.org/pubkey.asc
> I love long mails! | https://email.is-not-s.ms/
>
--
Kindest,
Jonathan
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.riverbankcomputing.com/pipermail/pyqt/attachments/20171122/139af1fa/attachment.html>
More information about the PyQt
mailing list