Python 中的 FIDL 绑定

本页提供了不同 FIDL 类型的示例,以及如何在 Python 中实例化和使用这些类型。

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

位和枚举类型

位和枚举类型在 Python 中以相同的方式表示,因此此示例适用于两者。

FIDL

library test.bits;

type MyBits = strict bits : uint32 {
    MY_FIRST_BIT = 1;
    MY_OTHER_BIT = 2;
    // check for any collisions between the bitmask and a "mask" member
    MASK = 4;
};

Python

import fidl_test_bits

a = fidl_test_bits.MyBits.MY_FIRST_BIT
b = fidl_test_bits.MyBits(0b10)
c = fidl_test_bits.MyBits(0b10000101)

print(f"{a!r}")
print(f"{b!r}")
print(f"{c!r}")

上述 Python 代码会生成以下输出:

<MyBits.MY_FIRST_BIT: 1>
<MyBits.MY_OTHER_BIT: 2>
<MyBits.MY_FIRST_BIT|MASK|128: 133>

结构体类型

在 Python 中,大小限制在构造期间不会强制执行,因此如果您要创建一个包含过长字符串的结构体,例如,下面的示例在尝试将结构体编码为字节之前不会为用户创建错误。其他复合结构(例如表和并集)也是如此。

FIDL

library test.struct;

type Simple = struct {
    f1 uint8;
    f2 bool;
};

type BasicStruct = struct {
    x uint32;
    y string;
};

Python

import fidl_test_struct

d = fidl_test_struct.Simple(f1=5, f2=True)

print(f"{d!r}")

上述 Python 代码会生成以下输出:

Simple(f1=5, f2=True)

如果您尝试在缺少某个字段的情况下构造此类型,系统会引发 TypeError 异常,其中列出了缺少的参数。

表类型

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

FIDL

library test.table;

type EmptyTable = table {};

type SimpleTable = table {
    1: x int64;
    5: y int64;
};

Python

import fidl_test_table

e = fidl_test_table.EmptyTable()
f = fidl_test_table.SimpleTable(x=6)
g = fidl_test_table.SimpleTable(y=7)
h = fidl_test_table.SimpleTable()

print(f"{e!r}")
print(f"{f!r}")
print(f"{g!r}")
print(f"{h!r}")

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

EmptyTable()
SimpleTable(x=6, y=None)
SimpleTable(x=None, y=7)
SimpleTable(x=None, y=None)

联合类型

这些类型的工作方式与结构类型类似,但只能指定一个变体。灵活的联合可以支持不指定任何变体。

FIDL

library test.union;

type Pizza = struct {
    toppings vector<string:16>;
};

type Pasta = struct {
    sauce string:16;
};

type PizzaOrPasta = strict union {
    1: pizza Pizza;
    2: pasta Pasta;
};

Python

import fidl_test_union

i = fidl_test_union.PizzaOrPasta(
    pizza=fidl_test_union.Pizza(toppings=["pepperoni", "jalapeños"])
)
j = fidl_test_union.PizzaOrPasta(pasta=fidl_test_union.Pasta(sauce="pesto"))

print(f"{i!r}")
print(f"{j!r}")

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

<'PizzaOrPasta' object(pizza=Pizza(toppings=['pepperoni', 'jalapeños']))>
<'PizzaOrPasta' object(pasta=Pasta(sauce='pesto'))>