&-Operator unter Windows und Linux

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
antimatter
User
Beiträge: 13
Registriert: Freitag 8. Oktober 2010, 16:44

Hallo zusammen,
die Konstellation des &-Operators mit dem >-Operator verhält sich bei mir unter Windows 7 anders, als unter Ubuntu. Wenn ich ein Qt.ItemFlags-Objekt mit & auf den Flag Qt.ItemIsEditable prüfe und dieser enthalten ist, sollte dieser Flag das Ergebnis des Tests sein. Mit dem Vergleichsoperator == kann man das prüfen. Aber es geht auch mit weniger Schreibaufwand, indem einfach auf "> 0" geprüft wird. Das ist valide, weil der fragliche Flag in diesem Fall 2 ist. Unter Ubuntu ergibt das in der Tat einen wahren Ausdruck. Unter Windows aber nicht. Dort muss ich das ItemFlags-Objekt explizit in ein int(...) setzen, damit auch der >-Vergleich richtig arbeitet.

Weiss jemand, warum das so ist?
Hier ein kleines Beispielprogramm, dass die Sachlage verdeutlicht.

Code: Alles auswählen

from PyQt4.QtCore import Qt

flags = Qt.ItemFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsEditable)
print Qt.ItemIsEditable

# Windows: True, Ubuntu: True
print (flags & Qt.ItemIsEditable) == Qt.ItemIsEditable

# Windows: False (???), Ubuntu: True
print (flags & Qt.ItemIsEditable) > 0

# Windows: True, Ubuntu: True
print int(flags & Qt.ItemIsEditable) > 0
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Bei den ganzen Flags handelt es sich um _Bitmuster_ und nicht um Zahlen, sie als Zahlen zu behandeln kann schiefgehen.

Kann es sein, dass du unter Windows eine 32-bit Version und unter Ubuntu eine 64-bit Version hast?
antimatter
User
Beiträge: 13
Registriert: Freitag 8. Oktober 2010, 16:44

Hi,
es ist umgekehrt. Windows 7 ist 64-bit und das Ubuntu ist eine 32-bit Version.

Gruß,
Andi
lunar

@antimatter Lass Dir mal "type(flags & Qt.ItemisEditable)" ausgeben. Dann siehst Du, dass es sich bei dem Ergebnis dieses Ausdrucks nicht um eine Zahl handelt. Ob der Vergleich eines Objekts dieses Typs mit einer Zahl funktioniert, hängt mithin von der Implementierung von "__gt__()" ab. Offensichtlich ist diese Methode in der PyQt-Version, die Du unter Ubuntu verwendest, entsprechend implementiert, in derjenigen unter Windows dagegen nicht.
BlackJack

Zumindest in Python 2 ist Vergleichen mit ``<`` und ``>`` immer möglich. Bei Objekten unterschiedlichen Typs garantiert das Ergebnis nur, dass es innerhalb eines Programmlaufs konsistent ist. Mehr nicht. Ist also alles mehr oder weniger Zufall beziehungsweise Implementierungsdetail.
Antworten