Starlark 語言

回報問題 查看原始碼 。 。 。 。 夜間。 。 7.37.2 。 。 7.1 。 。 7.0 。 。 6.5

本頁內容是 Starlark 的總覽。 先前稱為 Skylark,這是 Bazel 使用的語言。如需 函式和類型,請參閱 Bazel API 參考資料

如要進一步瞭解此程式語言,請參閱 Starlark 的 GitHub 存放區

如要瞭解 Starlark 語法的權威規格和 行為,請參閱 Starlark 語言規格

語法

Starlark 的語法來自 Python3。以下是 Starlark 中的有效語法:

def fizz_buzz(n):
  """Print Fizz Buzz numbers from 1 to n."""
  for i in range(1, n + 1):
    s = ""
    if i % 3 == 0:
      s += "Fizz"
    if i % 5 == 0:
      s += "Buzz"
    print(s if s else i)

fizz_buzz(20)

Starlark 的語意可能與 Python 不同,但行為差異 極少數的情況,除非是 Starlark 發生錯誤的情況。下列 Python 支援的類型:

可變動性

Starlark 的不變性選擇。系統提供兩種可變動的資料結構: 清單字典。可變動項目的變更 資料結構,例如將值附加至清單,或是刪除 字典僅適用於在目前結構定義中建立的物件。執行 結構定義完成後,其值就無法變更。

這是因為 Bazel 建構作業會使用平行執行程序。在建構期間,每個 .bzl 檔案和每個 BUILD 檔案都會取得各自的執行內容。每條規則 和自己的背景資料進行分析

以下舉例說明包含 foo.bzl 檔案的範例:

# `foo.bzl`
var = [] # declare a list

def fct(): # declare a function
  var.append(5) # append a value to the list

fct() # execute the fct function

Bazel 會在 foo.bzl 載入時建立 var。因此 var 屬於 foo.bzl 的 相關資訊fct() 執行時,會在 foo.bzl 的環境中執行。更新後 foo.bzl 的評估作業完成後,環境會包含不可變更的項目。 var,值為 [5]

當另一個 bar.bzlfoo.bzl 載入符號時,已載入的值會保留 無法變更因此,以下 bar.bzl 中的程式碼是無效的:

# `bar.bzl`
load(":foo.bzl", "var", "fct") # loads `var`, and `fct` from `./foo.bzl`

var.append(6)  # runtime error, the list stored in var is frozen

fct()          # runtime error, fct() attempts to modify a frozen list

bzl 檔案中定義的全域變數無法變更 bzl 檔案定義這些元素。和上述使用 bzl 檔案的範例一樣 由規則傳回的值均不可變動。

BUILD 和 .bzl 檔案的差異

BUILD 檔案會透過呼叫規則來註冊目標。提供 .bzl 個檔案 常數、規則、巨集和函式的定義。

原生函式原生規則是以下項目的全域符號: BUILD 檔案。bzl 檔案需要使用 native 模組載入這些檔案。

BUILD 檔案有兩個語法限制:1) 宣告函式為 無效,以及 2) *args**kwargs 引數無效。

與 Python 的差異

  • 全域變數不可變動。

  • 頂層不允許使用 for 陳述式。在函式中使用 。在 BUILD 檔案中,您可以使用清單理解功能。

  • 頂層不允許使用 if 陳述式。不過,if 運算式 可使用:first = data[0] if len(data) > 0 else None

  • 透過字典疊代的確定順序。

  • 不允許遞迴。

  • Int 類型限制為 32 位元帶正負號整數。溢位會擲回錯誤。

  • 在疊代期間修改集合時發生錯誤。

  • 相等測試、比較運算子 <<=>=> 等除外 未定義任何值類型簡而言之:5 < 'foo' 會擲回錯誤, 5 == "5" 會傳回 false。

  • 在元組中,只有在元組於 括號 — 您編寫 (1,) 時,而不是 1,

  • 字典常值不得包含重複的索引鍵。舉例來說 錯誤:{"a": 4, "b": 7, "a": 1}

  • 字串以雙引號表示 (例如您呼叫 repr)。

  • 字串無法疊代。

不支援下列 Python 功能:

  • 隱含字串串連 (使用明確的 + 運算子)。
  • 鏈結比較 (例如 1 < x < 5)。
  • class (請參閱 struct 函式)。
  • import (請參閱 load 陳述式)。
  • whileyield
  • 浮點值和設定型別。
  • 產生器和產生器運算式
  • is (改為使用 ==)。
  • tryraiseexceptfinally (請參閱 fail 以瞭解嚴重錯誤)。
  • globalnonlocal
  • 大部分的內建函式和大部分的方法