通过Thrift返回Python字典时,如何处理“Null”值?

时间:2016-05-21 13:01:07

标签: python server thrift

我正在使用Thrift来编写用python编写的微服务 我在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值。
我怎样才能在Thrift中处理这个问题?

这是我的Thrift文件中的代码:

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

dev_id键的值为NULL时,Thrift不会返回字典,并且Thrift客户端会抛出错误。

2 个答案:

答案 0 :(得分: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

然后,您可以在Thrift中查看no_dev值,并在未定义dev_id时执行任何适当的操作。

Shankar在他的回答中提出了一个很好的观点:如果0是有效的user.dev_id值,您需要使用三元运算符来设置字典的dev_id成员,否则您将错误地获取&#39; no_dev&#39;

答案 1 :(得分:2)

有两种方法可以做到这一点:

三元条件运算符

您可以在dev_id作业中使用三元条件运算符。

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

现在你可以检查&#39; not_found&#39;字典中的值并适当地处理它。

or逻辑运算符

另一种选择是在Tom Barron回答

时使用or
dev_id = user.dev_id or 'no_dev'

注意: or的使用并不能消除user.dev_id可能有0的假值的极端情况。字符串的数字或空字符串。此类虚假值将触发or并将'no_dev'分配给dev_id。如果需要保留这样的假值,那么使用三元条件运算符。