Error/crash/hang when comparing enum value to uncomparable type

pyqtbugs at toeai.com pyqtbugs at toeai.com
Wed Feb 22 23:47:39 GMT 2023


Le 24/10/2022 à 03:16, Phil Thompson a écrit :
> PyQt5 enums don't support comparisons with strings.

Jean Abou Samra went on to ask whether comparing such uncomparable types 
ever "worked" and got the reply:

> I don't think so.
> 
> Phil

But what I'm seeing is that they still kind of "work", even if they're 
not supposed to.

Within the Python 3 REPL, I can do:
>>> from PyQt5.QtGui import QKeySequence
>>> not QKeySequence.InsertLineSeparator == "string"
True
>>> assert not QKeySequence.InsertLineSeparator == "string"
TypeError: a member of enum 'StandardKey' is expected not 'str'

The above exception was the direct cause of the following exception:

SystemError: _PyEval_EvalFrameDefault returned a result with an 
exception set
>>> 

I'm guessing that these comparisons kind of sort of working (not really, 
but seeming like they do) is what led to these bugs staying in the 
Frescobaldi app for so many years unnoticed.

Three questions:

1) Can you explain why there isn't an error when the expression 
containing the '==' comparison is dumped directly to the REPL but it 
does raise an error when you assign it to a variable name, pass it to a 
function, use it in an assert statement, etc.?  (NB: The error does not 
actually prevent the expression from being assigned to the given 
variable name, and the expression can be made fairly complex, e.g. 
putting it in a list and multiplying it by 5.  Nor does the error 
prevent the assertion from being evaluated.  You can see that if you 
remove the "not" in the example above.  The error does seem to prevent a 
function call.)

2) Can you explain why the result is still assigned to variable names 
and used in assert statements when an error occurs, unlike what we're 
all used to, e.g.
one_over_zero = 1/0
of course does NOT set any value to 'one_over_zero'.  Nor does:
assert 1/0 and False
raise an assertion error.

3) Can you explain why '!=' expressions evaluate without error, e.g.
>>> QKeySequence.InsertLineSeparator != "string"
True
>>> assert QKeySequence.InsertLineSeparator != "string"
>>> print("Not equal:", QKeySequence.InsertLineSeparator != "string")
Not equal: True
>>> 
(Very counterintuitive behavior, given the examples above.)


Thanks.


More information about the PyQt mailing list