2016-05-21 10 views
4

私は、Pythonで書かれたマイクロサービスのためにThriftを使用しています。
pythonでNULLの値を含む辞書を返しています。ThriftでPython辞書を返すときに "Null"値を扱うにはどうしたらいいですか?

これは私のPythonの応答ハンドラのコードです:

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 

response関数は辞書とdev_id鍵を返している多くの場合、NULL値を持っています。
これを処理するにはどうすればよいですか?

この

は私のスリフトファイル内のコードです:

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

dev_idキーが辞書を返しませんNULL値スリフトを持っており、エラーがスリフトクライアントによってスローされます。例えば

答えて

2

は、あなたがこれを行うことができ、2つの方法があります。

三項条件演算子

あなたはdev_id割り当てに三項条件演算子を使用することができます。

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

これで、辞書で 'not_found'の値をチェックして適切に処理できます。トム・バロンが答えているように

or論理演算子

他のオプションは、割り当てにorを使用することです

dev_id = user.dev_id or 'no_dev' 

注:orの使用は、コーナーケースがなくなるわけではありませんuser.dev_idは数字の場合0、文字列の場合は空の文字列のような偽の値を持つことができます。このような偽の値はorをトリガーし、'no_dev'dev_idに割り当てます。このような偽の値を保存する必要がある場合は、三項条件演算子を使用します。

2

一つの解決策は、その不在を示すために有効なdev_id値になることはありません値を使用行うことであろう

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 

次に、あなたは倹約にno_dev値を監視することができますし、 dev_idが定義されていない場合は、適切な処理を行います。

Shankarは答えが良い点です:0が有効なuser.dev_id値であれば、辞書のdev_idメンバーを設定する必要があります。そうしないと、 'no_dev' 。

+0

@Mango:良い編集。ありがとう! –

+0

問題はありませんでした。素晴らしい答えでした。私がしたことは、コードを少し分かりやすくすることでした) –

+0

'user.dev_id'が0の場合はどうなりますか? 'または'はまだ起動し、 'dev_id'には' 'no_dev ''が割り当てられます。 –