Frage

In C # könnte ich einfach schreiben die folgende:

string stringValue = string.IsNullOrEmpty( otherString ) ? defaultString : otherString;

Gibt es einen schnellen Weg, um die gleiche Sache in Python zu tun, oder ist ich mit einer ‚if‘ Anweisung stecken?

War es hilfreich?

Lösung

In Python 2.5 gibt es

A if C else B

, das verhält sich sehr ähnlich: in C. Allerdings ist es verpönt, aus zwei Gründen: Lesbarkeit, und die Tatsache, dass es in der Regel ein einfacher Weg, um das Problem zu nähern. Zum Beispiel, in Ihrem Fall:

stringValue = otherString or defaultString

Andere Tipps

@ Dan

if otherString:
   stringValue = otherString
else:
   stringValue = defaultString
     

Diese Art von Code ist länger und ausdrucksstark, sondern auch besser lesbar

Nun ja, es ist mehr. Nicht so sicher „ausdrucksvoll“ und „lesbare“. Am allerwenigsten, ist Ihr Anspruch strittig. Ich würde sogar so weit zu sagen, es ist geradezu falsch, aus zwei Gründen gehen.

Als erstes Code betont die Entscheidungsfindung (und nicht extrem). Onthe Andererseits betont der Bedingungsoperator etwas anderes, nämlich der Wert (resp. Die Zuordnung des Wertes). Und das ist genau , was der Schreiber dieses Code will. Die Entscheidungsfindung ist wirklich eher ein Nebenprodukt des Codes. Der wichtige Teil ist hier die Zuweisungsoperation. Ihr Code verbirgt diese Zuordnung in einer Menge von syntaktischen Rauschen. Die Verzweigung

Der Code ist weniger ausdrucksvoll, weil es den Schwerpunkt von dem wichtigen Teil verschiebt.

Selbst dann Ihr Code würde wahrscheinlich Trumpf einig obskure ASCII-Kunst wie ?:. Ein Inline-if vorzuziehen wäre. Ich persönlich mag es nicht, die Variante mit Python eingeführt 2.5, weil es nach hinten ist. Ich würde etwas, das in dem gleichen Fluss liest (Richtung) als C ternären Operator bevorzugen, sondern verwendet Worte anstelle von ASCII-Zeichen:

C = if cond then A else B

Diese gewinnt die Hände nach unten.

C und C # leider hat nicht so eine ausdrucksvolle Aussage. Aber (und das ist das zweite Argument) wird die ternäre Konditionaloperator von C Sprachen so lange festgestellt, dass es ein Idiom in sich selbst geworden ist. Der ternäre Operator ist so viel ein Teil der Sprache als „konventionelle“ if Aussage. Weil es ein Idiom ist, jemand, der die Sprache sofort weiß, liest diesen Code richtig. Darüber hinaus ist es eine extrem kurze, prägnante Art und Weise, diese Semantik auszudrücken. In der Tat ist es die kürzeste erdenkliche Art und Weise. Es ist extrem ausdruck, weil es nicht das Wesen mit unnötigem Lärm nicht verdeckt.

Schließlich hat Jeff Atwood den perfekten Abschluss folgt geschrieben: Der beste Code kein Code ist bei allen .

Es ist nie eine schlechte Sache lesbar, ausdruck Code zu schreiben.

if otherString:
   stringValue = otherString
else:
   stringValue = defaultString

Diese Art von Code ist länger und ausdrucksstark, sondern auch besser lesbar und weniger wahrscheinlich zu bekommen stolpert oder falsch bearbeiten die Straße hinunter. Haben Sie keine Angst expressiv zu schreiben -. Lesbarer Code sollte ein Ziel sein, kein Nebenprodukt

Es gibt ein paar Duplikate dieser Frage, z.

Im Wesentlichen in einer allgemeinen Einstellung Pre-2.5-Code sollte diese verwenden:

 (condExp and [thenExp] or [elseExp])[0]

(gegeben condExp, thenExp und elseExp sind beliebige Ausdrücke), wie es zu falschen Ergebnissen vermeidet, wenn thenExp wertet False boolean, während Kurzauswertung beibehalten wird.

By the way, j0rd4n, nicht wahr ( Sie nicht!) Code schreiben, wie dies in C #. Abgesehen von der Tatsache, dass der IsDefaultOrNull tatsächlich IsNullOrEmpty genannt wird, ist dies reiner Code aufblasen. C # bietet den coalesce Operator für Situationen wie diese:

string stringValue = otherString ?? defaultString;

Es ist wahr, dass dies nur funktioniert, wenn otherString null ist (und nicht leer), aber, wenn dies vorher sichergestellt werden kann (und oft kann es) es macht den Code viel besser lesbar.

Ich entdeckte auch, dass nur die „oder“ Operator ziemlich gut funktioniert. Zum Beispiel:

finalString = get_override() or defaultString

Wenn get_override () returns "" oder None, es wird immer mit defaultString .

Kapitel 4 von diveintopython.net hat die Antwort. Es ist die und-oder Trick in Python genannt.

Sie können die Vorteile aus der Tatsache ziehen, dass logische Ausdrücke ihren Wert zurückgeben, und zwar nicht nur wahr oder falsch Status. Zum Beispiel können Sie immer wie folgt:

result = question and firstanswer or secondanswer

Mit dem Vorbehalt, dass es nicht wie der ternären Operator funktioniert, wenn firstanswer falsch ist. Dies liegt daran, Frage zuerst ausgewertet wird, es stimmt firstanswer vorausgesetzt zurückgegeben wird, es sei denn firstanswer falsch ist, so dass diese Nutzung nicht wie der ternäre Operator zu handeln. Wenn Sie die Werte kennen, jedoch gibt es in der Regel kein Problem. Ein Beispiel wäre:

result = choice == 7 and "Seven" or "Another Choice"

Wenn Sie Rubin verwendet, könnten Sie schreiben

stringValue = otherString.blank? ? defaultString : otherString;

die eingebaute blank? Methode bedeutet null oder leer.
Kommen Sie vorbei zur dunklen Seite ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top