用python实现的uavcan dsdl前端处理
pydsdl的Python项目详细描述
Pydsdl
pydsdl是一个用python实现的dsdl编译器前端。
pydsdl支持uavcan规范中定义的所有dsdl特性,
并执行所有必需的静态定义有效性检查。
此外,它还检查同一主版本下数据类型定义的位兼容性。 文件 Pydsdl需要Python3.5或更新版本。
使用库不需要安装第三方依赖项。 从pip安装: 通过导入来确保其工作: 该库与以下第三方软件库捆绑在一起(通过捆绑,
用户无需安装): 库api非常简单,它的所有实体都可以在 应用程序使用目标根命名空间的路径调用函数 函数有一个可选的可调用参数,当前端遇到
根据规范的要求,前端默认拒绝不受管理的固定端口ID。
若要允许不受监管的固定端口ID,请将参数"允许不受监管的固定端口ID"传递为true。
此选项很危险,除非您真正理解其含义,否则不得使用它。 dsdl数据类型通过以下python类型建模。
用户应用程序不应该直接实例化它们。
它们共享相同的共同祖先 类型 serviceType是一种特殊情况:与其他类型不同,它不能直接序列化;
相反,它包含两个伪字段: 每个数据类型(即 compositeType(及其衍生物)的实例包含属性。
根据规范,属性可以是字段或常量。
相应的数据模型如下所示: 根类 类型 根异常类型遵循命名模式 将 常量表达式值通过根在 尽管库本身是不依赖的,
开发和测试需要一些额外的包。
它们列在 此项目中不允许外部运行时依赖项--
如果你不能把它和图书馆捆绑在一起,你就不能使用它。 遵循pep8,但以下情况除外:
行长度限制为120个字符(而不是79个字符)。 所有函数和方法都必须进行类型注释。这在mypy中是静态执行的。 确保与Python3.5和所有更新版本兼容。 不要导入特定的实体;而是只导入包本身,然后使用详细引用,
如下所示。
如果确实需要导入特定实体,请考虑在其前面加下划线以防止
范围泄漏,除非你真的想让它在外部可见。
例外情况适用封装良好的子模块,这些子模块不是库api的一部分
(即,以下划线作为前缀)。 目标是在分支覆盖模式下覆盖100%的代码。 将单元测试编写为不带前缀为 使用标准 有关更多信息,请参阅pytest文档。 使用脚本demo.py
安装
pip install pydsdl
。
或者,将此存储库导入到代码库中,
将其根目录添加到python导入查找路径中,就可以开始滚动了。import pydsdl
捆绑的第三方软件
库API
.py
中看到。
使用
帮助(实体)
读取每个实体的特定文档。
下面您将看到主要api元素的简要概述。主要功能
read_namespace
pydsdl.read_namespace()
。
它将被读取,并且是查找根命名空间目录的可选列表。
它返回在目标根命名空间中找到的顶级复合类型定义的列表。
如果发现错误,将引发相应的异常(如下所述)。@print
定义中的指令,或前端需要发出诊断消息时。
Callable提供了要打印的字符串和相关语句的位置,用于诊断目的。
如果未提供函数,则@print
语句将不会产生任何输出(尽管它们的表达式将
尽管如此,失败的评估仍将被视为致命错误),并且所有诊断
会被压制。
无论此参数如何,所有诊断和打印也将打印在日志中。数据类型模型
serializabletype
和命名模式pydsdl.*type
:serializabletype
-根类;它还继承自pydsdl.any
,因为dsdl类型也是值。
voidType
-例如void16
基本类型
booleantype
-例如,bool
算术类型
floattype
-例如,截断的float16
整数类型
签名类型
-例如,int16
unsignedintegertype
-例如,饱和uint32
数组类型
固定长度数组类型
-例如,uint8[256]可变长度数组类型
-例如,uint8[<;256]复合类型
-请参见下文。
uniontype
-消息类型或嵌套结构。结构类型
-消息类型或嵌套结构。服务类型
-服务类型,不可序列化。compositeType
是最有趣的类型,因为它在解释时表示实际的dsdl定义。
以下是它最重要的属性,从它们的名称来看,它们的语义应该足够明显:
完整名称:str
,版本:pydsdl.version
,已弃用:bool
,字段:list[pydsdl.field]
,
常量:list[pydsdl.constant]
,固定端口id:optional[int]
请求
和响应
,其中包含请求和
服务类型的响应结构。serializabletype
根类)都具有以下公共属性
(尽管它们在针对servicetype
的实例使用时会引发typeerror
):位长度集:位长度集-该类型的所有序列化表示形式的位长度值集。
类型
bitlengthset
与本机整数集类型相似。set[int]
:它是可iterable和可比较的,
此外,还有几种重要的方便的位长设置操作方法。-数据类型的字符串表示是一个有效的dsdl表达式,它将
如果由DSDL处理器计算,则生成相同的数据类型。
例如:
饱和uint8[<;=2]
,uavcan.node.heartbeat.1.0
\uu hash\uu()
-数据类型是可哈希的。属性
-根类。
字段
-例如uavcan.node.heartbeat.1.0状态
paddingfield
-例如,void5
(名称始终为空)常量
-例如,uint16 value=0x1234属性
公开以下公共属性:数据类型:pydsdl.serializableType
-属性的数据类型。name:str
-属性的名称;填充字段总是空的。常量
还有一个属性值:pydsdl.any
,它返回常量的值
作为DSDL表达式值。请阅读下面的详细信息。错误模型
pydsdl.*error
,它们用于表示错误:frontenderror
-包含属性路径:str
和行:int
,这两个属性都是可选的,
指出错误发生的确切位置:dsdl文件的路径和
文件中的行号(从一开始)。如果设置了行,则还设置了路径。
内部错误
-前端本身发生的错误,不属于处理过的定义的错误。invalidDefinitionerror
-表示处理的定义有问题。
此类型由十几个特殊的错误异常类继承;但是,下面的类层次结构
此类型不稳定,应用程序不应直接使用。frontenderror
(或派生)对象转换为str
将以传统错误格式生成错误消息
适用于大多数IDE的错误分析器;例如:uavcan/internet/udp/500.HandleIncomingPacket.1.0.uavcan:33: Error such and such
表达式模型
pydsdl.any
下的python类型表示。
dsdl类型也是常量值,因此pydsdl.serializabletype
(类型模型的根)继承自
pydsdl.any
。类层次结构如下:any
-有一个类属性(即"static"属性)type_name:str
,它包含类型的dsdl名称。
基元
-基元值;具有虚拟属性本机值
包含值的表示。
布尔型
-布尔型常量;具有本机值:bool
rational
-实值近似;具有native_value:fractions.fraction
,是_integer()->;bool
,以及
作为本地整数()->;int
(如果包含的数字不是整数,则抛出此函数)。字符串
-Unicode字符串;具有本机值:str
容器
-通用容器;具有元素类型:类型[any]
并且是可访问的。
集合
-一个DSDL常量同构集合。开发
依赖关系
requirements-dev.txt中
编码约定
from.import_serializable# Goodfrom._serializableimportCompositeType# Pls no
编写测试
\u unittest\u
的参数的函数。
测试函数应尽可能靠近测试代码,
最好在同一个python模块的末尾。assert
语句进行断言。
要获得额外的功能,请在本地测试函数中导入pytest
。
不要在测试函数之外导入pytest,因为它会破坏库
在启用测试的环境之外。def_unittest_my_test()->None:# Type annotations requiredimportpytest# OK to import inside test functions only (rarely useful)assertget_the_answer()==42
释放
release_on_pypi.sh
在pypi上发布新版本。
不要忘记标记每个已发布的版本;标记格式为<;major>;<;minor>;<;patch>;
而不带v
前缀。推荐PyPI第三方库