为python-sproto添加map支持

上个月太忙了,做完这个修改还没写博客,现在补一下。。

之前使用protobuf做协议打包的时候,经常会有个痛点,没法用具体数据的值作为key来索引数据。比如现在客户端上传了造兵协议,协议大概长这样:

{
   {
      troop_type = 101,
      amount = 1,
   },
   {
      troop_tyoe = 102,
      amount = 2,
   },
}

可以看到,造兵协议是一个数组,数组里每个元素是一个结构,包含troop_type(兵种类别)和amount(数量)。每次收到的时候,都需要遍历一次来建立一个以troop_type为key的字典,或者使用时根据troop_type来遍历查找。

sproto添加的这个支持,就是通过添加一点语法糖,让解出来的数据可以天然的以troop_type做key,解出来的数据就变成这样:

{
   [101] = {
      troop_type = 1,
      amount = 1,
   },
   [102] = {
      troop_tyoe = 2,
      amount = 2,
   },
}

python绑定添加这个支持不难,但是会丧失一个错误检查的机会。当把一个Dict传给sproto的时候,如果这个域的定义是数组,将会报错退出。现在支持map后,将会兼容这种情况,直接取出Dict的value作为数组的内容。解包的时候,操作会稍微复杂一点,因为解包出来的域,根据协议应该是一个List,但是mainindex会提示需要将这个域变成一个Dict。

最后,还添加了一点异常处理,若解包过程中出错,会把解出来的这个字典直接释放掉。有点担心异常处理的时候,会不会导致引用计数没有处理好,引起内存泄漏。以后有空再做一下内存泄漏分析~具体的修改可以参考:https://github.com/spin6lock/python-sproto.git

时间: 2024-11-20 22:47:31

为python-sproto添加map支持的相关文章

python 添加tab支持及安装redis

添加tab支持 tab内容: vim tab.py #! /usr/bin/python import sys import readline import rlcompleter import os readline.parse_and_bind('tab: complete') histfile = os.path.join(os.environ['HOME'],'.pythonhistory') 2.查看python遍历路径 >>> import sys >>>

Spring Boot 添加JSP支持【转】

Spring Boot 添加JSP支持 大体步骤: (1)            创建Maven web project: (2)            在pom.xml文件添加依赖: (3)            配置application.properties支持jsp (4)            编写测试Controller (5)          编写JSP页面 (6)          编写启动类App.Java 1,FreeMarker2,Groovy3,Thymeleaf (s

阿里云服务器,在主机管理控制台添加系统支持的 MIME 的类型

问题描述: 在虚拟主机上发布网站后,MP4文件无法播放,提示修改MIME,有以下解决方案? 1. Windows 主机系统的虚拟主机,在 主机管理控制台 可以添加系统支持的 MIME 的类型. 操作的方式: 登录 主机管理控制台 > 站点信息 > 高级环境设置 > MIME类型设置. MIME 类型如果不知道,请查看文档最后列出的常用类型介绍. 比如添加 pdf ,mp4等类型 : 第一个方框(文件类型)填写 .pdf ,第二个(应用程序)填写 application/pdf . 第一个

打造自己的便携sublime,并添加右键支持

经过近阶段sublime text 3的使用,对这款编辑器越来越喜欢,无论是外观还是功能,都已做到了编辑器中的顶级.如果你不是 emacs 和 vim 的死忠,那么这款编辑器你绝对不应该错过.虽说这是一款收费软件,listen有70$,但是未注册版也没有任何功能限制,只会在你 save 一定次数后弹出一次购买提示,按Esc即消失,真是业界良心.大家一定要多支持正版.这里推荐大家使用portable version,打好插件,设好配置,就可以压缩打包存储到网盘或U盘中,随时随地使用.我打了10多个

SpringBoot入门九,添加shiro支持

项目基本配置参考SpringBoot入门一,使用myEclipse新建一个SpringBoot项目,使用myEclipse新建一个SpringBoot项目即可.现在来给项目添加shiro支持,数据暂时硬编码,不连接数据库,具体内容如下: 1. pom.xml添加以下配置信息 <!-- 开启shiro依赖 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-s

为UiAutomatorViewer添加xpath支持

UiAutomatorViewer是Android SDK自带的测试工具,用来查看手机或模拟器上的界面元素,小巧,简单,开箱即用,十分方便.美中不足之处在于,它不能获取界面元素的xpath. 写自动化测试脚本时,xpath是一种非常方便的定位方式.Appium等一些成熟的工具框架可以获取到界面元素xpath,但使用起来稍有点重量级.那么是否也可以给UiAutomatorViewer添加xpath支持呢? 答案是肯定的. 首先下载UiAutomatorView源代码,我用的地址是https://a

为Gradle添加UTF-8支持

gradle默认使用系统字符编码,大多数中文系统是使用GBK编码 但程序员绝大部分都是使用UTF-8写各类java文件以及其他资源文件 编译时很容易报错,比如下面的错误: ”警告:编码 GBK 的不可映射字符“ 有两种办法可以给gradle添加UTF-8支持 第一种,在我们的项目配置文件build.gradle中最后添加下面的语句 tasks.withType(JavaCompile) { options.encoding = "UTF-8" } 这样,这个项目在进行gradle打包时

为UIAlertView添加block支持

系统自带的UIAlertView只能支持delegate方式. 如果你只有一个UIAlertView这种方式可能无关紧要. 但如果你有二个或多个UIAlertView, 你需要在委托方法中进行判断是哪个UIAlertView实例的产生的委托, 接着又要判断是响应哪个button. 如果你曾经这样做过, 想想这是多杂的代码. Objective-C是支持块代码的, 如果对UIAlertView添加块支持, 那岂不是一个美事. 这里推荐一个开源的实现: https://github.com/jiv

Ubuntu下安装VirtualBox并为其添加USB支持

1.下载VirtualBox软件包和USB支持包 下载网址均为为:https://www.virtualbox.org/wiki/Downloads VirtualBox软件包下载项: VirtualBox 4.3.10 for Linux hosts USB支持包下载项: VirtualBox 4.3.10 Oracle VM VirtualBox Extension Pack All supported platforms 2.下载完成后,进行安装 3.添加当前用户到组 sudo gedit