2015-03-03 6 views
5

die C-Funktion int get_events(), Betrachten Rückkehr, die eine Bitmaske der folgenden Ereignisse zurück:Wie eine Funktion wickeln eine Bitmaske in Python

#define EVENT_KEY_DOWN 1 
#define EVENT_KEY_UP  2 
#define EVENT_KEY_PRESS 4 

Es könnte 5 zurückkehren, zum Beispiel ausgelöst wurden sowohl EVENT_KEY_DOWN und EVENT_KEY_PRESS Bedeutung .

dachte ich über die folgenden Möglichkeiten, um den Wert aus der Funktion zu Python-Code zurück:

  • "as is", dh 5
  • ein Tupel von ganzen Zahlen: (1, 4)
  • ein Tupel von Strings : ('EVENT_KEY_DOWN', 'EVENT_KEY_PRESS')

(In allen Fällen I Konstanten wie erklären könnte und mymodule.EVENT_KEY_PRESS, auch.)

Gibt es einen "empfohlenen" Weg?

+0

In den meisten Sprachen führen Flags/Bitmasken, die als nicht ganzzahlige Typen gespeichert sind, oft zu mehr Arbeit. Das heißt, da Sie tun können, wenn 'EVENT_KEY_PRESS' in Maske: 'oder ähnliches, sehe ich keinen Nachteil Tupel von konstanten Strings in Python zu verwenden. Das heißt, ich würde eine Variable' EVENT_KEY_PRESS 'mit einigen eindeutigen deklarieren Wert, so können Sie Tippfehler in der Zeichenfolge vermeiden – Basic

+0

Ich würde für eine Reihe von Zeichenfolgen 'set (('EVENT_KEY_UP', 'EVENT_KEY_PRESS'))' – mkiever

+0

Das Problem ist die Änderung, wenn Sie garantieren können, dass Ihre C/Python-Definitionen sein wird Während der Lebensdauer des Projekts werden Sie ordnungsgemäß aktualisiert und synchronisiert, und Sie müssen nicht mit verschiedenen Versionen interagieren, dann verwenden Sie Bitmasken. Andernfalls wäre es eine gute Idee, sie mit Strings darzustellen. – imreal

Antwort

0

Sparse is better than dense; readability counts. Ich würde das Tupel von Strings nach dieser Logik auswählen, aber auch nach Mustern suchen, wie Sie die API verwenden. Wenn Sie sich beispielsweise in einem performancekritischen Codepfad befinden, sollten Sie erwägen, ihn als Bitmaske zu belassen.

Verwandte Themen