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