2016-05-21 7 views
4

Ich benutze Thrift für einen Mikro-Service in Python geschrieben.
Ich gebe ein Wörterbuch in Python zurück, das NULL Werte enthalten kann. Wie kann ich "Null" -Werte behandeln, wenn ich ein Python-Wörterbuch über Thrift zurücksende?

Dies ist der Code für meine Python-Antwort-Handler:

def response(id, token): 
    user_record = usertable.objects.get(uid = id) 
    if user_record.token == token: 
     response = dict(
      pa_uid = user_record.pa_uid, 
      pa_token = user_record.pa_token, 
      dev_id = user.dev_id 
     ) 
     return response 

Die response Funktion ist das ein Wörterbuch der Rückkehr und die dev_id Schlüssel hat einen NULL Wert in vielen Fällen.
Wie kann ich damit in Thrift umgehen?

Dies ist der Code in meiner Thrift-Datei:

service Calculator extends shared.SharedService { 
    map<string,string> response(1:string id, 2:string token), 
} 

Wenn die dev_id Schlüssel einen NULL Wert Thrift haben keinen Wörterbuch zurückzukehren und ein Fehler durch das Thrift-Client ausgelöst.

Antwort

2

Es gibt zwei Möglichkeiten, wie Sie dies tun können:

Der ternäre Konditionaloperator

Sie den ternären bedingten Operator in der dev_id Zuordnung verwenden können.

dev_id = user.dev_id if user.dev_id != None else 'not_found' 

Jetzt können Sie nach 'not_found' Wert im Wörterbuch suchen und es entsprechend behandeln.

Der or logische Operator

Die andere Option ist or in Zuordnung zu verwenden, wie Tom Barron

dev_id = user.dev_id or 'no_dev' 

Hinweis beantwortet hat: Die Verwendung von or beseitigt nicht die Ecke Fall wobei der user.dev_id kann einen falsy Wert wie 0 im Falle von Nummer oder leere Zeichenfolge im Falle von Strings haben. Solche Falsy-Werte werden or auslösen und 'no_dev' zu dev_id zuweisen. Wenn solche Falsy-Werte beibehalten werden müssen, verwenden Sie den ternären Bedingungsoperator.

2

Eine Lösung wäre, um einen Wert zu tun verwenden, die nie ein gültiger dev_id Wert ist seine Abwesenheit, um anzuzeigen:

Zum Beispiel:

def response(id, token): 
    user_record = usertable.objects.get(uid = id) 
    if user_record.token == token: 
     response = dict(
      pa_uid = user_record.pa_uid, 
      pa_token = user_record.pa_token, 
      dev_id = user.dev_id or 'no_dev' 
     ) 
     return response 

Dann können Sie für den no_dev Wert in Thrift beobachten und Tue was immer angemessen ist, wenn dev_id nicht definiert wurde.

Shankar macht einen guten Punkt in seiner Antwort: Wenn 0 ein gültiger user.dev_id-Wert ist, müssen Sie einen ternären Operator verwenden, um das dev_id-Mitglied des Wörterbuchs zu setzen, da Sie andernfalls 'no_dev' falsch erhalten .

+0

@Mango: Gute Änderungen. Vielen Dank! –

+0

Kein Problem, es war eine großartige Antwort, alles was ich gemacht habe, war, den Code ein wenig einfacher zu verstehen;) –

+0

Was ist, wenn die 'user.dev_id' 0 ist? Das 'or' wird immer noch eingefügt und' dev_id' wird '' no_dev'' zugewiesen. –