【问题标题】:How can I handle "Null" values when returning a Python dictionary through Thrift?通过 Thrift 返回 Python 字典时如何处理“Null”值?
【发布时间】:2016-09-18 16:45:26
【问题描述】:

我正在将 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 客户端抛出错误。

【问题讨论】:

    标签: python server thrift


    【解决方案1】:

    一种解决方案是使用一个永远不是有效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”。

    【讨论】:

    • 没问题,这是一个很好的答案,我所做的只是让代码更容易理解;)
    • 如果 user.dev_id 是 0 怎么办? or 仍将启动,dev_id 将分配给 'no_dev'
    【解决方案2】:

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

    三元条件运算符

    您可以在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。如果需要保留此类虚假值,请使用三元条件运算符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-19
      • 2015-11-02
      • 2011-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多