Python 中的 FIDL 绑定

本页面提供了不同 FIDL 类型及其定义方式的示例, 实例化并在 Python 中使用。

大多数示例侧重于如何将类型从 FIDL 转换为 Python。 如果您想了解如何实现 FIDL 服务器或如何处理 请参阅教程异步 Python 最佳实践页面。

位和枚举类型

位和枚举类型在 Python 中的表示方式相同,因此,本示例 两者皆可

FIDL

library fidl.example.library;

type ExampleBits = strict bits {
    EXAMPLE_ONE = 0x01;
    EXAMPLE_TWO = 0x02;
};

Python

import fidl.example_library

x = fidl.example_library.ExampleBits.EXAMPLE_ONE
y = fidl.example_library.ExampleBits.EXAMPLE_TWO
z = fidl.example_library.ExampleBits(1)  # creates EXAMPLE_ONE
a = fidl.example_library.ExampleBits(9999)
print(x)
print(y)
print(z)
print(a)

上面的 Python 代码会输出以下输出:

<ExampleBits.EXAMPLE_ONE: 1>
<ExampleBits.EXAMPLE_TWO: 2>
<ExampleBits.EXAMPLE_ONE: 1>
<ExampleBits.EXAMPLE_ONE|EXAMPLE_TWO|9996: 9999>

结构体类型

在 Python 中,类型和大小限制在构建期间不会强制执行,因此,如果您 构建一个包含过长字符串的结构体,例如,下面的示例 在尝试将结构体编码为 字节。这也适用于其他合成结构,例如表格和 并集。

FIDL

library example.library;

type ExampleStruct = struct {
    field_one uint32;
    field_two string:256;
};

Python

import example_library;

x = fidl.example_library.ExampleStruct(field_one=123, field_two="hello")
print(x)

上面的 Python 代码会输出以下输出:

ExampleStruct(field_one=123, field_two="hello")

如果您要尝试在没有任何字段的情况下构建此类型, 会引发 TypeError 异常,列出缺少的参数。

表类型

这些类型与结构体类型相同,但没有严格的构造函数 要求。未提供给构造函数的任何字段都将设置为 None

FIDL

library example.library;

type ExampleTable = table {
    1: field_one uint32;
    2: field_two string:256;
    3: field_three vector<uint32>:256;
};

Python

import fidl.example_library

x = fidl.example_library.ExampleTable(field_one=2)
y = fidl.example_library.ExampleTable(field_three=[1, 2, 3])
z = fidl.example_library.ExampleTable()
print(x)
print(y)
print(z)

此 Python 代码会输出以下输出:

ExampleTable(field_one=2, field_two=None, field_three=None)
ExampleTable(field_one=None, field_two=None, field_three=[1, 2, 3])
ExampleTable(field_one=None, field_two=None, field_three=None)

联合类型

在 Python 中,可以通过多种方式构造该对象。

FIDL

library example.library;

type ExampleUnion = strict union {
    1: first_kind uint32;
    2: second_kind string:256;
};

Python

import fidl.example_library

x = fidl.example_library.ExampleUnion.first_kind_variant(123)
y = fidl.example_library.ExampleUnion()
y.second_kind = "hello"
print(x)
print(y)

此 Python 代码会输出以下输出:

<'example.library/ExampleUnion' object(first_kind=123)>
<'example.library/ExampleUnion' object(second_kind="hello")>