用python实现的uavcan dsdl前端处理

pydsdl的Python项目详细描述


Pydsdl

travis ci覆盖状态pypi-python versioncodacy徽章

pydsdl是一个用python实现的dsdl编译器前端。

pydsdl支持uavcan规范中定义的所有dsdl特性, 并执行所有必需的静态定义有效性检查。 此外,它还检查同一主版本下数据类型定义的位兼容性。

文件demo.py

中提供了一个简短的使用示例。

安装

Pydsdl需要Python3.5或更新版本。 使用库不需要安装第三方依赖项。

从pip安装:pip install pydsdl。 或者,将此存储库导入到代码库中, 将其根目录添加到python导入查找路径中,就可以开始滚动了。

通过导入来确保其工作:import pydsdl

捆绑的第三方软件

该库与以下第三方软件库捆绑在一起(通过捆绑, 用户无需安装):

  • 麻省理工学院许可证的erik rose所著的吝啬
  • 麻省理工学院许可证的Benjamin Peterson所著的《需要节约》一书。six

库API

库api非常简单,它的所有实体都可以在.py中看到。 使用帮助(实体)读取每个实体的特定文档。 下面您将看到主要api元素的简要概述。

主要功能read_namespace

应用程序使用目标根命名空间的路径调用函数pydsdl.read_namespace()。 它将被读取,并且是查找根命名空间目录的可选列表。 它返回在目标根命名空间中找到的顶级复合类型定义的列表。 如果发现错误,将引发相应的异常(如下所述)。

函数有一个可选的可调用参数,当前端遇到 @print定义中的指令,或前端需要发出诊断消息时。 Callable提供了要打印的字符串和相关语句的位置,用于诊断目的。 如果未提供函数,则@print语句将不会产生任何输出(尽管它们的表达式将 尽管如此,失败的评估仍将被视为致命错误),并且所有诊断 会被压制。 无论此参数如何,所有诊断和打印也将打印在日志中。

根据规范的要求,前端默认拒绝不受管理的固定端口ID。 若要允许不受监管的固定端口ID,请将参数"允许不受监管的固定端口ID"传递为true。 此选项很危险,除非您真正理解其含义,否则不得使用它。

数据类型模型

dsdl数据类型通过以下python类型建模。 用户应用程序不应该直接实例化它们。 它们共享相同的共同祖先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]

serviceType是一种特殊情况:与其他类型不同,它不能直接序列化; 相反,它包含两个伪字段:请求响应,其中包含请求和 服务类型的响应结构。

每个数据类型(即serializabletype根类)都具有以下公共属性 (尽管它们在针对servicetype的实例使用时会引发typeerror):

  • 位长度集:位长度集-该类型的所有序列化表示形式的位长度值集。 类型bitlengthset与本机整数集类型相似。set[int]:它是可iterable和可比较的, 此外,还有几种重要的方便的位长设置操作方法。
  • -数据类型的字符串表示是一个有效的dsdl表达式,它将 如果由DSDL处理器计算,则生成相同的数据类型。 例如:饱和uint8[<;=2]uavcan.node.heartbeat.1.0
  • \uu hash\uu()-数据类型是可哈希的。

compositeType(及其衍生物)的实例包含属性。 根据规范,属性可以是字段或常量。 相应的数据模型如下所示:

  • 属性-根类。
    • 字段-例如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中

此项目中不允许外部运行时依赖项-- 如果你不能把它和图书馆捆绑在一起,你就不能使用它。

编码约定

遵循pep8,但以下情况除外: 行长度限制为120个字符(而不是79个字符)。

所有函数和方法都必须进行类型注释。这在mypy中是静态执行的。

确保与Python3.5和所有更新版本兼容。

不要导入特定的实体;而是只导入包本身,然后使用详细引用, 如下所示。 如果确实需要导入特定实体,请考虑在其前面加下划线以防止 范围泄漏,除非你真的想让它在外部可见。 例外情况适用封装良好的子模块,这些子模块不是库api的一部分 (即,以下划线作为前缀)。

from.import_serializable# Goodfrom._serializableimportCompositeType# Pls no

编写测试

目标是在分支覆盖模式下覆盖100%的代码。

将单元测试编写为不带前缀为\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

有关更多信息,请参阅pytest文档。

释放

使用脚本release_on_pypi.sh在pypi上发布新版本。 不要忘记标记每个已发布的版本;标记格式为<;major>;<;minor>;<;patch>;而不带v前缀。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
html如何在JavaScript中获取当前Windows用户的名称   用于屏蔽电子邮件的java正则表达式   java Jsoup Android解析   为了避免在运行时缺少Java泛型,将超类型绑定到子类实例   java JTextArea。setText(空);不会释放内存   安卓源Java OutOfMemoryError在构建AOSP 10时出错   java打印到达数组末尾所需的最小跳数序列   使用mvn命令的java Selenium TestNG并行执行   javasocket编程:在关闭服务器之前通知所有客户端   java如何在加载新的安卓片段时显示progressbar?   java从actor系统中删除AKKA actor,并创建另一个具有相同路径名的actor   java我可以用浓缩咖啡做性能测试,还是应该用其他东西?   JavaTreeView(TreeItem)是否可以获取层次结构索引?   带远程服务的java Android应用程序