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