Starlark 言語

<ph type="x-smartling-placeholder"></ph> 問題を報告する ソースを表示 夜間 · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

このページでは、Starlark の概要について説明します。 (Bazel で使用されている言語、旧称 Skylark)。Google 広告ヘルプセンターの 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 は不変性を好みます。次の 2 つの変更可能なデータ構造を使用できます。 listdicts。可変への変更 リストへの値の追加や ディクショナリは、現在のコンテキストで作成されたオブジェクトに対してのみ有効です。アフター その値は不変になります。

これは、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

foo.bzl が読み込まれると、Bazel は var を作成します。したがって、varfoo.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 ファイルには、次の 2 つの構文上の制限があります。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 など)。
  • classstruct 関数を参照)。
  • importload ステートメントを参照)。
  • whileyield
  • float 型と set 型です。
  • ジェネレータとジェネレータ式が含まれています。
  • is(代わりに == を使用)。
  • tryraiseexceptfinally(致命的なエラーについては fail を参照)。
  • globalnonlocal
  • 組み込み関数、メソッド、関数です。