かんちゃんの備忘録

プログラミングや言語処理、ゲームなど知的好奇心のための備忘録(個人の感想)です。

1年ぶりのXonsh

本記事は Xonsh Advent Calendar 2018の16日目の記事です。

昨年の Advent Calendar 以降使っていなかった Xonsh について約1年ぶりに触ります。

ほんと少しでも書いてくれるだけでハッピー。

ということで、よりハッピーになっていただきたいのでほんの少し書きました。

Pythonのモジュールが提供する機能をパイプラインに組み込めれば便利そうだったので、コマンドを作ってみました。

導入

インストール

$ pip install xonsh

起動

$ xonsh

コマンドを作る

~/.xonshrc に関数とそのエイリアスを定義することで、 xonsh が認識します。

def _hoge():
    print("fuga")


aliases["hoge"] = _hoge

aliases が対話型シェル環境からコマンドとして利用できるコマンド群のエイリアスとなります。

関数の引数には、 argsstdin といったコマンドに対する引数や標準入出力などを定義できるようです。

こんなコマンドだと便利?

中央値や最頻値をさくっと出せると便利かもしれないと思い、コマンドを定義してみました。

# ~/.xonshrc
import statistics


def _mean(args, stdin=None, stdout=None):
    print(
        statistics.mean((float(line.strip()) for line in stdin)),
        file=stdout
    )

def _mode(args, stdin=None, stdout=None):
    print(
        statistics.mode((line.strip() for line in stdin)),
        file=stdout
    )


aliases["mean"] = _mean
aliases["mode"] = _mode

上記の関数を試してみます。

$ source ~/.xonshrc
$ seq 10 | sort -r | mean
5.5
$ echo "1\n2\n3\n2" | sort -r | mode
2
$ echo "ほげ\nふが\nほげ" | sort -r | mode
ほげ

複数列に拡張していくのは、引数の管理が大変そうです。 エラー処理も割と大変そうなので、デコレータ作るとボイラープレート減らせるのかな?と思いました。

シンプルに cut コマンドと組み合わせることで、わざわざファイルを確認するためにコードを書かなくても済みそうです。