本記事の目的
ibisの"_"(deferred resolver, 遅延リゾルバ)を利用していた際に、問題だなと思ったことを調べた。
問題点:Pythonの伝統的なアンダースコアの使い方と競合する
想定読者
- ibisに触ったことがある人
- 遅延リゾルバを使っていて想定外のエラーが出た人
環境
以下の環境で動作を確認していますが、多少変わっていても大丈夫だと思います。
- Python == 3.12.0
- ibis == 11.0.0
遅延リゾルバの基本的な使い方
直前に定義されたTableオブジェクトをそのまま表現する仮の存在
使い方は公式ドキュメントでほとんど解決
Pythonの伝統的なアンダースコアの使い方と競合する
GitHub Issue #4704に指摘がある通り、伝統的なPythonでの_ の使われ方と競合、混乱を招いている。
例えば、関数の戻り値の破棄を明示的に行うものがある。
def func():
return 1, 2
a, _ = func() # 第2戻り値は使わないよ
この直後に、ibisの_ を使おうとするとエラーが発生する。
t = (
table
.group_by(_.x)
.agg(y_mean=_.y.mean())
)
# AttributeError: 'int' object has no attribute 'x'
_ には「2」が入っていて、Tableオブジェクトではないため'x'を呼び出せないエラー。
伝統的な使い方とibisの遅延リゾルバを併用するとバグを生む可能性がある
解決策
GitHub Issue #4704曰く、「別名でインポートしろ」とのこと
from ibis import _ as c
t = (
table
.group_by(c.x)
.agg(y_mean=c.y.mean())
)
これで、伝統的なPythonの記述方法と競合を避けることができる。
考えてみれば当たり前だった...
※ cはcolumnのからきている。列の参照によく使われるかららしい。