Verwenden Sie einen Ausdruck zweimal in einer Zeile - als Bedingung UND für die Formatierung von Zeichenfolgen?

8

Ich finde, dass ich in vielen verschiedenen Projekten eine Menge Code schreibe, wo ich einen (mäßig komplexen, möglicherweise kostenintensiven) Ausdruck auswerten muss und dann etwas damit machen soll (zB für die String-Formatierung) ), aber nur wenn der Ausdruck True / Non-None ist.

Zum Beispiel in vielen Orten mache ich etwas wie folgt:

%Vor%

... was ich denke, ist im Grunde ein Spezialfall des allgemeineren Problems, eine Funktion eines Ausdrucks zurückgeben zu wollen, aber nur, wenn dieser Ausdruck wahr ist, d.h.:

%Vor%

, aber ohne den Ausdruck erneut einzugeben (oder neu zu bewerten, falls es sich um einen kostspieligen Funktionsaufruf handelt).

Offensichtlich kann die erforderliche Logik leicht auf verschiedene langatmige Weise erreicht werden (z. B. indem der Ausdruck in mehrere Anweisungen aufgeteilt wird und der Ausdruck einer temporären Variablen zugewiesen wird), aber das ist ein wenig grungy und da dies wie ein ganz allgemeines scheint Problem, und da Python ziemlich cool ist (besonders für funktionale Sachen), habe ich mich gefragt, ob es eine nette, elegante und prägnante Möglichkeit gibt, es zu tun?

Meine aktuellen besten Optionen sind entweder das Definieren eines kurzlebigen Lambda, um sich darum zu kümmern (besser als mehrere Anweisungen, aber ein bisschen schwer zu lesen):

%Vor%

oder schreibe meine eigene Dienstprogrammfunktion wie:

%Vor%

... aber da ich das in vielen verschiedenen Code-Basen mache, würde ich lieber eine eingebaute Bibliotheksfunktion oder eine clevere Python-Syntax verwenden, wenn so etwas existiert.

    
Ben Spiller 15.01.2013, 11:59
quelle

5 Antworten

1

Nachdem ich die Antworten gehört habe (danke, Jungs!) bin ich überzeugt, dass es in Python keine Möglichkeit gibt, das zu erreichen, was ich will, ohne eine neue Funktion (oder Lambda-Funktion) zu definieren.

Für die beste Klarheit entschied ich, dass dies als eine wiederverwendbare Funktion (nicht Lambda) implementiert werden sollte, also dachte ich, dass ich zum Nutzen anderer die Funktion teilen würde, die ich letztendlich hatte - die flexibel genug ist, um mehrere zu bewältigen zusätzliche Formatzeichenfolgenargumente (zusätzlich zu dem Hauptargument, das verwendet wird, um zu entscheiden, ob die Formatierung überhaupt durchgeführt werden soll); Es kommt auch mit Pythondoc, um Korrektheit zu zeigen und die Verwendung zu veranschaulichen (wenn Sie nicht sicher sind, wie die ** kwargs Sache funktioniert, ignorieren Sie es einfach, es ist nur ein Implementierungsdetail und war die einzige Möglichkeit, ein optionales defaultValue = kwarg zu implementieren die Variablenliste der Formatstring-Argumente).

%Vor%     
Ben Spiller 23.01.2013, 14:17
quelle
7

Ich mag definitiv One-Liner. Aber manchmal sind sie die falsche Lösung.

Wenn in der professionellen Softwareentwicklung die Teamgröße & gt; 2, Sie verbrachten mehr Zeit damit, Code zu verstehen, den jemand anderes geschrieben hat, als über neuen Code zu schreiben. Die hier vorgestellten Einzeiler sind definitiv verwirrend, also machen Sie einfach zwei Zeilen (auch wenn Sie in Ihrem Beitrag mehrere Anweisungen erwähnt haben):

%Vor%

Das ist klar, prägnant und jeder versteht sofort, was hier vorgeht.

    
Thorsten Kranz 15.01.2013 12:27
quelle
4

Python hat keinen Gültigkeitsbereich ( Gibt es a Python-Äquivalent des Haskell 'Let' ), vermutlich weil die Missbräuche und Verwirrungen der Syntax die Vorteile überwiegen.

Wenn Sie unbedingt einen Ausdrucksbereich verwenden müssen, ist die schlechteste Option, ein Generatorverständnis zu missbrauchen:

%Vor%     
ecatmur 15.01.2013 12:13
quelle
3

Sie können eine bedingte Formatierungsfunktion einmal definieren und sie wiederholt verwenden:

%Vor%

Verwendung:

%Vor%     
Ber 15.01.2013 13:30
quelle
0

Vermutlich möchten Sie dies wiederholt tun , um eine Zeichenfolge aufzubauen. Bei einer globaleren Ansicht könnten Sie feststellen, dass filter (oder itertools.ifilter ) die gewünschten Werte für die Sammlung von Werten verwendet.

Sie werden mit so etwas enden:

%Vor%

Die Verwendung von None als erstes Argument für filter zeigt an, dass ein wahrer Wert akzeptiert werden soll. Als konkretes Beispiel mit einem einfachen Ausdruck:

%Vor%

Abhängig davon, wie Sie die Werte berechnen, kann es sein, dass eine äquivalente Liste oder ein ähnlicher Generator verständlicher ist.

    
Michael J. Barber 15.01.2013 14:18
quelle