Python: Wenn mehr als eines von drei Dingen wahr ist, gebe false zurück

8

Ich schreibe ein Django-Modell, das meiner Website Coupons ermöglicht.

Coupons können drei Arten haben: Lebenszeitgutschein, bestimmter Zeitraum von Monaten Gutschein, bestimmte Anzahl von Dollar Gutschein.

Um die Dinge einfach zu halten, erlaube ich Coupons nur, einen der drei möglichen Werte zu haben (d. h. ein Gutschein kann nicht für 10 und 5 Monate sein). Aber ich möchte überprüfen, wenn ein Gutschein gespeichert wird, um sicherzustellen, dass diese Regel wahr ist.

Momentan habe ich:

%Vor%

Ich weiß, es gibt einen besseren Weg, dies zu tun, aber ich sehe es nicht (nenne es den Block des Coders).

Hilfe wird sehr geschätzt.

Für den Fall, dass es sich ergibt, sind die drei Typen int, int und bool

%Vor%     
Ted 14.07.2011, 01:37
quelle

11 Antworten

9

Eine Sache, die ich in ähnlichen Situationen gemacht habe, ist diese:

%Vor%

Es ist jetzt viel einfacher, neue Coupon-Typen hinzuzufügen, nach denen in Zukunft gesucht werden soll!

    
randlet 14.07.2011, 02:33
quelle
3

Sie können auch eine Liste comp verwenden, um falsche Werte zu filtern:

%Vor%

Oder aufbauend auf MRABs Antwort :

%Vor%     
zeekay 14.07.2011 01:55
quelle
2

Behalten Sie die Menge in einem einzelnen Feld bei, und weisen Sie dem Typ ein separates Feld zu, das choices verwendet.

    
Ignacio Vazquez-Abrams 14.07.2011 01:48
quelle
2

Ihr Code sieht gut aus. Hier ist warum:

1.) Du hast es geschrieben und du beschreibst die Logik. Sie können alle Arten von syntaktischen Tricks ausführen, um die Codezeilen zu reduzieren (true_count + = 1, wenn self.months sonst 0, riesige if-Anweisung usw.), aber ich denke, die Art, wie Sie sie haben, ist perfekt, weil es das ist, was Sie zuerst tun gedacht beim Versuch, die Logik zu beschreiben.

Lass den niedlichen Code für die Programmier-Herausforderungen, das ist die reale Welt.

2.) Wenn Sie sich jemals entscheiden, dass Sie eine andere Art von Coupon-Werttyp hinzufügen müssen, wissen Sie genau, was Sie tun müssen: Fügen Sie eine weitere if-Anweisung hinzu. In einer komplexen if-Anweisung würde dies zu einer schwierigeren Aufgabe führen.

    
Mark Hildreth 14.07.2011 01:47
quelle
2
%Vor%

Bearbeiten:

Ich habe mit einer Karnaugh-Map (http://en.wikipedia.org/wiki/Karnaugh_map) eine schnelle Circuit-Mimization durchgeführt. Es endet, das ist die kleinste mögliche Funktion mit boolescher Logik:

%Vor%

Logisch sind beide Aussagen gleichwertig, aber die zweite ist technisch schneller / effizienter.

Edit # 2 : Wenn jemand hier interessiert ist, ist die K-Map

%Vor%

Was reduziert auf:

%Vor%     
Swift 14.07.2011 01:41
quelle
2

Ich denke, es ist in Ordnung, dies über ein paar Zeilen zu verteilen - das macht es leichter zu pflegen, wenn es in Zukunft mehr Attribute zum Testen geben würde. Die Verwendung von len oder sum fühlt sich ein wenig zu verschleiert an

%Vor%     
John La Rooy 14.07.2011 02:20
quelle
1

Ich weiß nicht, ob das für dich besser ist, aber es würde so funktionieren:

%Vor%     
Adam Smith 14.07.2011 01:45
quelle
1

Wenn Sie Python 2.7 oder neuer haben

%Vor%     
John La Rooy 14.07.2011 03:48
quelle
0

Noch bessere Lösung als zuvor, mit combinations , any und all . Angenommen, Sie haben alle Attribute, die Sie testen möchten, in einer Sequenz namens attributes :

%Vor%

In Englisch liest es

  

Sind alle Längen-2-Kombinationen der Attribute wahr?

Diese Lösung funktioniert für eine beliebige Anzahl von Attributen und kann modifiziert werden, um zu testen, ob eine beliebige Anzahl von ihnen wahr ist.

Obwohl es zugegebenermaßen sehr ineffizient ist, würde ich sagen, dass es ziemlich süß und lesbar ist.

    
machine yearning 14.07.2011 02:39
quelle
0

Wie wäre es mit

? %Vor%

Ich finde es genauso lesbar wie ein Listenverständnis mit einer if -Klausel und prägnanter.

    
Greg Ball 14.07.2011 04:29
quelle
-2

bool ist eine Unterklasse von int , weil Python ursprünglich bool und int für Boolean fehlten, also:

%Vor%

Das funktioniert, weil False == 0 und True == 1 beide wahr sind.

    
MRAB 14.07.2011 01:47
quelle

Tags und Links