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