memo

mypyのキーワード引数・デフォルト引数を持ったメソッドのプロトコルのメモ

デフォルト引数周りの型のことでちょっと把握できなかった部分があったのでメモ。 余分なデフォルト引数を持つ実装について 例えば、以下の様なプロトコルがあるとする。 import typing as t import typing_extensions as tx class Adder(tx.Protocol): def …

wsgirefでhttp用のreverse proxyを書いてみる

goだとnet/http/httputilに便利なコードが置いてあるのだけれど。pythonだとそういうものがない。 なのでとりあえずwsgirefでどうするかを考えてみた(hip by hopなどは対応していない)。 挙動としては、requestされたら、テキトウなurlにrequestsで通信する…

コマンドライン引数によって、オプション引数が変わるコマンドの書き方のメモ(2 phase parse?)

コマンドライン引数によって、オプション引数が変わる? 例えば --fn というオプションを取り、このオプションが fのときとgのときとで引数が変わるようなもの --fn無し --fn f --fn g # --fn 無し $ python 03cli.py usage: 03cli.py [--verbose] [--name NA…

functools.partialの元を辿る

時折、functools.partialで作られた値の元の値(関数)を辿りたくなることがある。そのようなことをしたくなった場合のメモ。 単純に辿りたい場合 単純に辿りたい場合は.funcを見れば良い。ついでにクラスである場合もサポートしてあげると親切。 def find_ori…

argparseで--limitと--no-limitのような相互排他なオプションの定義の仕方のメモ

ドキュメントを見れば分かることだけれど、たまに忘れるので。 import argparse def parse(argv=None): parser = argparse.ArgumentParser() limit_group = parser.add_mutually_exclusive_group() limit_group.add_argument("--limit", dest="limit", type=…

mypyの可変長な引数と戻り値の型の書き方

可変長引数 import typing as t import mypy_extensions as mx def f0() -> t.List[int]: return [] def f1(x0: int) -> t.List[int]: return [x0] def f2(x0: int, x1: int) -> t.List[int]: return [x0, x1] def fN(*xs: int) -> t.List[int]: return list…

なぜちょっとした作業をやるときにMakefileを書いてしまうのか

はじめに なぜちょっとした作業をやる時にMakefileを書きたくなってしまうのかということについて頭を整理してみることにした。 ちょっとした作業? その前にちょっとした作業とは何かということについて触れることにする。ちょっとした作業というのはぱっと…

makefileのforeachのハマりどころ

タスクランナーとしてのmakeのN回目。あんまり深追いしたくはないという気持ちもありつつ。 以前書いたようにmakefile中ではbashの関数などの定義ができない。そんなわけでdefineとcallを使う。これはこれで便利。ただforeachまで使おうとするとちょっとハマ…

emacsで正規表現で置換する場合に入力する値のメモ

emacsで正規表現で置換する場合のメモ。ついついescapeなどの対応関係を忘れてしまうので。 例 int(xxx)をxxxに変換する M-x replace-stringでminibufferで入力する場合 int(\([^)]+\)) -> \1 ちなみに文字列で渡す場合には全部にescapeが要る。 (replace-re…

go言語でローカルで定義した関数で再帰する話

go言語でローカルで定義した関数で再帰したいと思うことありますよね。ちょっと横着してクロージャに環境をキャプチャすることを任せてしまってそのコンテキストで木などを再帰的に辿りたいみたいな場合などに。 そんなわけでgoでもローカルで定義した関数上…

structの生成にfactory的な関数を用意しておくと埋め込みに変えたときに特に嬉しいという話

はじめに structの生成にfactory的な関数を用意しておくと埋め込みに変えたときに特に嬉しいという話。これはもしかしたらニッチな話かもしれない。あるいはgoの本のどこにでも書いてある一般的な話かもしれない。今日goのコードを書いていてなるほどなーと…

x/sync/errgroupの亜種みたいなものを考えたりしていた

突然ですがx/sync/errgroupはとても便利です。ちょっと並行で外部リソースにアクセスしたいときなどはsync/WaitGroupで書いてエラーの扱いを自分で頑張るよりerrgroupに任せた方が楽です。 g, ctx := errgroup.WithContext(ctx) // ここでのf0,f1,..などはgo…

go/types内で特定のobjectの保持しているメソッドの一覧を取得する方法

go/types内で特定のobjectの保持しているメソッドの一覧を取得する方法のメモ。 以下を知っておけば良い。 scope.Lookup(name)でtypes.Objectが取れる structと定義されているmethodの一覧の組はtypes.Namedというstructで管理されている types.Namedから全…

最近goでCLIのコマンドを作るときの雛形のメモ

たまにどう書くか忘れて調べたりするので自分用の雛形をメモしておく。 kingpin だいたい自分でCLIのコマンドを作る場合には以下のようにしている。 使っているのはkingpin。とは言えこのパッケージにこだわりがあるというわけではなく。goのコマンドライン…

go言語のASTの全てのコメントは、*ast.File以下の子孫ノードから集める事はできないという話

*ast.File はファイル中のすべてのコメントを持っている goでASTを取り出すと、通常はファイル単位で扱うことになる。この時の値の型は *ast.File。ここで対応するファイル中のすべてのコメントは ast.File のCommentsフィールドにある。コメントは *ast.Com…

goのast.Fileからファイル名を取得する方法

*ast.File からファイル名を取得したい goのファイルのimportなどの情報を取得するのに、直接 go/* のpackageを使うよりも golang.org/x/tools/go/loader を使うのが手軽。 pkgname := "golang.org/x/tools/refactor/rename" c := loader.Config{} c.Import(…

packageからfilepathを推測する方法あるいはその逆

packageからfilepathを推測する方法などをまとめておきたかった。 (ついでに個人的な信仰からホームディレクトリは~になっている) packageからfilepath package main import ( "go/build" "os" "os/user" "path/filepath" "strings" "github.com/pkg/errors"…

golangの現在のファイルのimport関係に即したTypeStringの表記を作る

TypeString? go/typesにQuqlifierという型がある。これと一緒にTypeStringという関数がある(いずれも、GOROOT/src/go/types/typestring.goに定義されている)。これらは型情報付きの表記をするために使われる。 type Qualifier func(*Package) string // Type…

goでmockを自動生成する以外に大きなinterfaceを扱う方法を考えたりしてた

goでmockを自動生成する以外に大きなinterfaceを扱う方法を考えたりしてた。基本的には綺麗に小さく分割するが正解であるし。そうするべきなのだけれど。それ以外の方法を考えたのでメモしておく。あとから見直してもちょっとトリッキーだと思うので常用する…

goでのslack通知(mail通知)のコードについて考えたりしていた

goでのslack通知(mail通知)のコードについて考えたりしていた。とりあえずの段階ではdispatcherという構造で管理するのが良さそうという感じにはなった。 ただ、色々な階層でのテストなどのことを考えるともう少し考えることがありそうな感じがしている。 di…

今年作ったgithubのrepositoryを調べる

もしかしたら今年も作ったrepositoryを振り返えったりするかもしれないので。そのメモ。 今年作ったパブリックなrepositoryの一覧を手に入れる方法について。 setup 残念ながら依存関係があるので以下のインストールが必要。 pip instlal httpie jqfpy 今年…

dabbrev-expandが手元のarchの環境で期待通りに動かない理由を調べた

(これはとても個人的なメモというか備忘録です) dabbrev-expandが手元のarchの環境で期待通りに動かない理由を調べた(付け加えておくと、手元のarchの環境が悪いのであってarchが悪いわけではない)。 はじめに 最近、自分の使っているemacsのdabbrev-expand…

context managerの`__enter__()`の呼び忘れを防ぎたい

はじめに context managerの__enter__()の呼び忘れを防ぎたい # こちらは正しい __enter__()が呼ばれている。 def ok(): with f(): do_something() # こちらはだめ def ng(): f() # 警告を出したい 方針 これはおそらくあんまり方法がなくって。gcに回収され…

メソッドを置き換えたmockをもう少しstrictにしてみたい

メソッドを置き換えたmockをもう少しstrictにしてみたい。mockのpatchなどでobjectを置き換える時に属性の存在まではspecやspec_setで対応できるのだけれど。メソッドのsignatureまで含めて置き換え前のものと同じかどうか確認したい。 例えば、存在しない属…

標準ライブラリの範囲でpythonでweb APIのmock serverが欲しくなった場合

mock serverが欲しい web apiのmock serverが欲しくなることがある。結構その場その場で欲しくなる機能というのが微妙に違ったりするので毎回そらで手書きする事が多い(本当は上手に抽象化できるのかもしれないけれどできていない)。今回の機能は以下の様な…

emacsでjqをJSONファイルのformatterとして使う

emacsでjqをJSONファイルのformatterとして使う。方法は2つ。 shell-command-on-regionを使う formatter専用の関数を作る shell-command-on-regionを使う M-|にshell-command-on-regionという関数がbindされている。これに引数を与えてあげると、現在選択さ…

marshmallow-polyfieldを使ってoneOf的な構造のdataを扱う

はじめに 例えば、以下のよう1つのfieldに複数の形状の値が入ることがある。そして、その形状を決めるためにtypeなどfieldを含まれているJSONがあるとする。 以下の様な感じ(下の例では、personとgroupという2つの形状がobに入る可能性がある)。 { "ob": { …

marshmallowで相互排他的なfieldを定義する方法

はじめに こういうJSONを許したい。 { "left": { "name": "foo", "value": 100, } } あるいはこう。 { "right": { "name": "foo", "value": 100.0, } } left,rightというfieldの内どちらか1つだけ値が入るデータをvalidとしたい。例えば以下はダメ。 {} これ…

jqの出力をパイプでつなげた時の挙動(slurpとunbuffered)について

about jq jqはjsonの整形に使われる。通常は以下のようなvalidなJSONを入力にする data.json { "name": "foo", "age": 20 } 整ったフォーマットで出力される。 $ cat data.json | jq . { "name": "foo", "age": 20 } diffなどを取る時には、-Sを使ってキーで…

グラフ描く簡単な環境作っときたいかも

グラフ描くの簡単な環境作っときたいかも。要求は以下の2つ。 手軽にグラフが描ける 手軽にグラフを共有できる 前者は例えばjupyter上でだけ表示みたいなのが嫌な感じ。 後者は例えばGUIで表示とかだけなのは嫌な感じ。 まだ結局一番良いと思える方法は見つ…