0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Ibisのアンダースコアは、Pythonの伝統的な使い方と競合するので解決策を調べた

Posted at

本記事の目的

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のからきている。列の参照によく使われるかららしい。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?