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'))>