<div dir="ltr"><div class="gmail_default" style="font-family:tahoma,sans-serif">@Florian & @Phil,</div><div class="gmail_default" style="font-family:tahoma,sans-serif"><br></div><div class="gmail_default" style="font-family:tahoma,sans-serif">Your posts crossed with my last one above.</div><div class="gmail_default" style="font-family:tahoma,sans-serif"><br></div><div class="gmail_default" style="font-family:tahoma,sans-serif">Technically as I wrote there, one does <i>not</i> have to "go through Qt reading whether a "<span style="font-family:monospace,monospace">QObject *</span>" does or does not accept NULL/None, because it automatically <i>does</i>.  As I wrote, if it does <i>not</i>, the correct Qt C++ declaration would have been "<span style="font-family:monospace,monospace">QObject &</span>", and that was up to the Qt people, not PyQt to guess.</div><div class="gmail_default" style="font-family:tahoma,sans-serif"><br></div><div class="gmail_default" style="font-family:tahoma,sans-serif">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 <i>my own</i> function parameters/returns with <span style="font-family:monospace,monospace">Union</span>; 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.<br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On 22 November 2017 at 10:03, Florian Bruhin <span dir="ltr"><<a href="mailto:me@the-compiler.org" target="_blank">me@the-compiler.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On Wed, Nov 22, 2017 at 09:38:21AM +0000, J Barchan wrote:<br>
> Thank you both, for the same solution.  I had noticed the Union[QWidget,<br>
> None] construct and wondered if that was the only way/what I'm supposed to<br>
</span>> do in Python.  But it raises two questions, *and only solves one of the two<br>
> problems*:<br>
<br>
As mentioned in an earlier reply, there's Optional[QWidget] which is a<br>
shorthand for that.<br>
<span class=""><br>
> 1. I am "surprised" at the need to do this from Python every time an object<br>
> might have value None.  It's "cumbersome" compared to the way NULL/0 is<br>
> handled from C++, where it's always an acceptable value for any Object*<br>
> parameter/return value.  Do you guys really write that for every place None<br>
> is acceptable?<br>
<br>
</span>Yes, and it's probably the more correct way, because the caller code *has* to<br>
deal with the value being None.<br>
<br>
> 2. The problem is unsolved where a *PyQt* function accepts/returns None.<br>
<span class="">> The second example I gave is calling QWidget.setParent(None).  The<br>
> declaration of this in QtWidgets.pyi is:<br>
><br>
>     def setParent(self, parent: 'QWidget') -> None:<br>
><br>
</span>> Following your solutions, this *ought* to have been:<br>
<span class="">><br>
>     def setParent(self, parent: typing.Union['QWidget', None]) -> None:<br>
><br>
</span>> But the problem is that it *isn't* defined like that in the .pyi, and I<br>
<span class="">> can't help that.  And it's not just that function, it's lots of others too<br>
> which accept or return None, so this issue keeps arising in my calling<br>
> code.  Was it PyQt's job to recognise this and generate a different<br>
> declaration or what?  Given where we are, I don't see any way of avoiding<br>
> the warning when calling such a PyQt function with None, do you?<br>
<br>
</span>Yes, PyQt should use Optional[QWidget] here. However, there's probably no way<br>
for PyQt to know where None is acceptable and where it isn't...<br>
<br>
FWIW last time I looked at PyQt's type definitions, they were mostly intended<br>
for IDE documentation, and not for typechecking - and mypy (probably the most<br>
widely used type checking tool) didn't like the files at all.<br>
<span class="HOEnZb"><font color="#888888"><br>
Florian<br>
<br>
--<br>
<a href="https://www.qutebrowser.org" rel="noreferrer" target="_blank">https://www.qutebrowser.org</a>  | <a href="mailto:me@the-compiler.org">me@the-compiler.org</a> (Mail/XMPP)<br>
   GPG: 916E B0C8 FD55 A072  | <a href="https://the-compiler.org/pubkey.asc" rel="noreferrer" target="_blank">https://the-compiler.org/<wbr>pubkey.asc</a><br>
         I love long mails!  | <a href="https://email.is-not-s.ms/" rel="noreferrer" target="_blank">https://email.is-not-s.ms/</a><br>
</font></span></blockquote></div><br><br clear="all"><br>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><span style="font-family:tahoma,sans-serif">Kindest,</span></div><div><span style="font-family:tahoma,sans-serif">Jonathan</span></div></div></div></div></div>
</div>