本页提供了不同 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'))>