本頁面提供不同 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'))>