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

How can I handle "Null" values when returning a Python dictionary through Thrift?

我将 Thrift 用于 python 编写的微服务。
我正在 return 中 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 函数是 return 字典,在许多情况下 dev_id 键有一个 NULL 值。
我如何在 Thrift 中处理这个问题?

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

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

dev_id 键有一个 NULL 值时,Thrift 没有 return 字典,Thrift 客户端会抛出错误。

一个解决方案是使用一个永远不是有效值的值 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 成员,否则您会错误地得到 'no_dev'.

您可以通过两种方式执行此操作:

三元条件运算符

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

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

现在您可以在字典中检查 'not_found' 值并适当地处理它。

or逻辑运算符

另一种选择是在作业中使用 or,正如 Tom Barron 已回答的

dev_id = user.dev_id or 'no_dev'

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