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