520 Stimmen

Gibt es eine Python-Entsprechung des C# Null-Koaleszenz-Operators?

In C# gibt es eine Nullkoalitionsoperator (geschrieben als ?? ), die eine einfache (kurze) Nullprüfung während der Zuweisung ermöglicht:

string s = null;
var other = s ?? "some default value";

Gibt es eine Entsprechung in Python?

Ich weiß, dass ich es kann:

s = None
other = s if s else "some default value"

Aber gibt es einen noch kürzeren Weg (bei dem ich nicht wiederholen muss s )?

11voto

Henhuy Punkte 804

Zusätzlich zu @Bothwells Antwort (die ich bevorzuge) für einzelne Werte, um die Zuordnung von Funktionsrückgabewerten auf Null zu prüfen, können Sie den neuen Walross-Operator (seit Python 3.8) verwenden:

def test():
    return

a = 2 if (x:= test()) is None else x

So, test Funktion muss nicht zwei Mal ausgewertet werden (wie in a = 2 if test() is None else test() )

2voto

Orca Punkte 57

Zusätzlich zu Julianos Antwort über das Verhalten von "oder": Es ist "schnell"

>>> 1 or 5/0
1

Daher kann es manchmal eine nützliche Abkürzung sein für Dinge wie

object = getCachedVersion() or getFromDB()

0voto

debo Punkte 309

Zu den Antworten von @Hugh Bothwell, @mortehu und @glglgl.

Einrichten des Datensatzes für die Prüfung

import random

dataset = [random.randint(0,15) if random.random() > .6 else None for i in range(1000)]

Definieren Sie Implementierungen

def not_none(x, y=None):
    if x is None:
        return y
    return x

def coalesce1(*arg):
  return reduce(lambda x, y: x if x is not None else y, arg)

def coalesce2(*args):
    return next((i for i in args if i is not None), None)

Testfunktion durchführen

def test_func(dataset, func):
    default = 1
    for i in dataset:
        func(i, default)

Ergebnisse auf Mac i7 @2.7Ghz mit Python 2.7

>>> %timeit test_func(dataset, not_none)
1000 loops, best of 3: 224 µs per loop

>>> %timeit test_func(dataset, coalesce1)
1000 loops, best of 3: 471 µs per loop

>>> %timeit test_func(dataset, coalesce2)
1000 loops, best of 3: 782 µs per loop

Offensichtlich ist die not_none Funktion beantwortet die Frage des Auftraggebers korrekt und behandelt das "Falsy"-Problem. Sie ist auch am schnellsten und am einfachsten zu lesen. Wenn die Logik an vielen Stellen angewendet werden soll, ist dies eindeutig der beste Weg.

Wenn Sie ein Problem haben, bei dem Sie den ersten Nicht-Null-Wert in einer Iterable finden wollen, dann ist @mortehus Antwort der richtige Weg. Aber es ist eine Lösung für ein anderes Problem als OP, obwohl es diesen Fall teilweise behandeln kann. Es kann nicht eine Iterable UND einen Standardwert annehmen. Das letzte Argument wäre der Standardwert, der zurückgegeben wird, aber dann würden Sie in diesem Fall auch keine Iterable übergeben, da es nicht explizit ist, dass das letzte Argument ein Standardwert ist.

Sie könnten dann unten etwas machen, aber ich würde trotzdem not_null für den Anwendungsfall Einzelwert.

def coalesce(*args, **kwargs):
    default = kwargs.get('default')
    return next((a for a in arg if a is not None), default)

-3voto

Angelo Punkte 1
Python has a get function that its very useful to return a value of an existent key, if the key exist;
if not it will return a default value.

def main():
    names = ['Jack','Maria','Betsy','James','Jack']
    names_repeated = dict()
    default_value = 0

    for find_name in names:
        names_repeated[find_name] = names_repeated.get(find_name, default_value) + 1

Wenn Sie den Namen nicht im Wörterbuch finden, wird der Standardwert zurückgegeben, Wenn der Name vorhanden ist, wird ein vorhandener Wert mit 1 hinzugefügt.

Ich hoffe, dies kann helfen

-3voto

Itaca Punkte 31

Für diejenigen wie mich, die hier stolperte auf der Suche nach einer praktikablen Lösung für dieses Problem, wenn die Variable undefiniert sein könnte, die am nächsten ich bekam ist:

if 'variablename' in globals() and ((variablename or False) == True):
  print('variable exists and it\'s true')
else:
  print('variable doesn\'t exist, or it\'s false')

Beachten Sie, dass bei der Überprüfung von Globals eine Zeichenkette benötigt wird, bei der Überprüfung des Werts jedoch die tatsächliche Variable verwendet wird.

Mehr zur variablen Existenz: Wie kann ich prüfen, ob eine Variable existiert?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X