Python 语言引导¶
本文将介绍如何在 Python 语言中使用 bitproto 。
前提¶
bitproto 生成的 Python 代码是基于 Python3 的,因为使用了 typing hint 和 dataclasses. 因此,请确保你在使用 Python3.7+ 。
编译 bitproto 生成 Python 文件¶
首先,执行 bitproto 的编译器来生成 Python 语言的代码:
$ bitproto py pen.bitproto
其中, pen.bitproto
已经在前面的章节 一个示例 bitproto 中做过说明。
我们会发现 bitproto 会在当前目录生成一个文件叫做 pen_bp.py
,其中包含了映射后的 class,常量和一些方法接口。
在生成的 pen_bp.py
文件中:
The
enum Color
in bitproto is mapped to anenum.IntEum
class, and the enum values are mapped to constants as well:@unique class Color(IntEnum): # 3 bit COLOR_UNKNOWN = 0 COLOR_RED = 1 COLOR_BLUE = 2 COLOR_GREEN = 3 COLOR_UNKNOWN: Color = Color.COLOR_UNKNOWN COLOR_RED: Color = Color.COLOR_RED COLOR_BLUE: Color = Color.COLOR_BLUE COLOR_GREEN: Color = Color.COLOR_GREEN
bitproto 中的
Timestamp
类型也被映射成为了一个 typing hint 的别名类型:Timestamp = int # 64bit
bitproto 中的
message Pen
映射成为了一个被 dataclass 装饰的类:@dataclass class Pen(bp.MessageBase): BYTES_LENGTH: ClassVar[int] = 9 color: Color = 0 # 3bit produced_at: Timestamp = field(default_factory=bp_default_factory_Timestamp) # 64bit
编译器同样生成了
Pen
的两个方法,一个是编码函数,另一个是解码函数:def encode(self) -> bytearray: pass def decode(self, s: bytearray) -> None: pass
安装 bitproto 的 Python 支持库¶
bitproto 序列化需要依赖目标语言的支持库来工作,在这里,我们生成的编解码函数依赖 bitproto 的 Python 语言支持库。
通过 pip 来安装:"
$ pip install bitprotolib
bitproto 的 Python 支持库的代码存在在 Github 上。
运行代码¶
现在,创建一个叫做 main.py
的文件,包含代码如下:
import pen_bp as bp
# Encode
p = bp.Pen(color=bp.COLOR_RED, produced_at=1611515729966)
s = p.encode()
# Decode
p1 = bp.Pen()
p1.decode(s)
# Print in json format
print(p1.to_json())
在上面的代码中,我们首先创建了一个 Pen
的实例 p
,并做了数据的初始化,随后执行了一个叫做 p.encode()
的函数,把 p
的数据编码到字节流 s
中,返回的 s
是一个 bytearray
。
在解码的部分,我们创建了另一个实例 p1
,然后调用 p1.decode()
方法,把字节流 s
中的数据解码到 p1
。
编译器同样生成了一个叫做 to_json()
的方法来输出结构化数据的 json 格式字符串。
现在执行它:
$ python main.py
{"color": 1, "produced_at": 1611515729966}