Python SDKの注釈サポートの改善

Pythonのような動的型付け言語における静的型チェックの重要性については議論の余地がありません。型ヒントにより、開発者は強力な型システムを活用して

  • より良いコードを記述し、
  • 曖昧なプログラミングロジックを自己文書化し、
  • PyCharmなどのIDEでインテリジェントなコード補完を可能にします。

そのため、BeamのPython SDKのtypehintsモジュールの今後の改善についてお知らせできることを嬉しく思います。これには、型付きPCollectionとPTransformへのPython 3スタイルの注釈のサポートが含まれます。

注釈の改善

現在、クラスデコレータまたはインライン関数を使用して、PTransformに型ヒントを宣言することができます。

例えば、デコレータを使用して型ヒントを宣言したPTransformは次のようになります。

@beam.typehints.with_input_types(int)
@beam.typehints.with_output_types(str)
class IntToStr(beam.PTransform):
    def expand(self, pcoll):
        return pcoll | beam.Map(lambda num: str(num))

strings = numbers | beam.ParDo(IntToStr())

代わりにインライン関数を使用した場合、同じ変換は次のようになります。

class IntToStr(beam.PTransform):
    def expand(self, pcoll):
        return pcoll | beam.Map(lambda num: str(num))

strings = numbers | beam.ParDo(IntToStr()).with_input_types(int).with_output_types(str)

どちらの方法にも問題があります。クラスデコレータは構文が複雑で、2行の追加コードが必要となる一方、インライン関数は同じ変換の他のインスタンスで再利用できない型ヒントを提供します。さらに、どちらの方法もMyPyなどの静的型チェッカーと互換性がありません。

しかし、Python 3の注釈を使用することで、これらの問題を回避し、クリーンで再利用可能な型ヒントエクスペリエンスを提供できます。以前の変換は、次のように見えます。

class IntToStr(beam.PTransform):
    def expand(self, pcoll: PCollection[int]) -> PCollection[str]:
        return pcoll | beam.Map(lambda num: str(num))

strings = numbers | beam.ParDo(IntToStr())

これらの型ヒントは、内部のBeam型システムに積極的にフックして、パイプラインの型チェックとランタイム型チェックの役割を果たします。

これはどのように機能するのでしょうか?

型付きPCollection

お分かりでしょう!PCollectionクラスはtyping.Genericを継承しており、0個の型(PCollectionと表記)または1個の型(PCollection[T]と表記)でパラメータ化することができます。

  • 0個の型のPCollectionは、暗黙的にPCollection[Any]に変換されます。
  • 1個の型のPCollectionは、任意のネストされた型(例:Union[int, str])を持つことができます。

内部的に、Beamの型システムは、外部のPCollectionコンテナを削除することで、これらの注釈を他の型ヒントと互換性を持たせます。

PBegin、PDone、None

最後に、PCollectionに加えて、PTransformのexpand(...)メソッドの有効な注釈はPBeginまたはNoneです。これらは一般的に、I/O操作で開始または終了するPTransformに使用されます。

例えば、データを保存する場合、変換の出力型はNoneにする必要があります。

class SaveResults(beam.PTransform):
    def expand(self, pcoll: PCollection[str]) -> None:
        return pcoll | beam.io.WriteToBigQuery(...)

次のステップ

何を待っているのでしょうか... 変換に注釈を使い始めてみましょう!

Pythonにおける型ヒントの詳細については、以下を参照してください:Pythonの型安全性の確保

最後に、問題が発生した場合はお知らせください