2018-01-01から1年間の記事一覧

mypyとTypedDictとtotalオプションについて

pythonでもdictに型を付けたいですね。一応TypedDictという型を定義したいという動きになっています。ちなみにまだこの機能はexperimentalになっているので。mypy_extensionsの方に入っています。 import mypy_extensions as mx class Pair(mx.TypedDict): l…

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

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

dictknifeのdiffに変更部分見比べられるような機能を追加した

github.com dictknifeのdiffに変更部分見比べられるような機能を追加した。ある意味昨日の以下の記事の続き。 dictknifeでmarkdownのテーブルの入出力に対応した - podhmo's diary 例えば以下の様な2つのJSONがあるとする 00.json { "name": "foo", "age": …

dictknifeでmarkdownのテーブルの入出力に対応した

github.com dictknifeでmarkdownのテーブルの入出力に対応した。欲しくなったので。概ねcsvと同様な形。 例 以下のようなJSONがあるとする。 data.json [ {"name": "foo", "age": 20}, {"name": "bar", "age": 21, "nickname": "B"}, {"name": "boo"} ] これ…

過去に作ったpythonの関数をコマンドとして扱えるようにするライブラリを更新しました

github.com 過去に作ったpythonの関数をコマンドとして扱えるようにするライブラリを更新しました。 なんでhandfcats? 猫の手も借りたいときに使いたかったからです。痒いところに手が届くという意味では、猫の手よりまごの手の方が近いのかもしれないですが…

pythonのargparseでのファイル入出力のちょっとだけ気になる点

pythonのargparseでのファイル入出力には、ちょっとだけ気になる点があります。これはそれらについてのメモです。 ファイル入力と標準入力を一緒に使う場合 以下のような形で入力を使いたい場合があると思います。 引数としてファイルを取る ファイルが渡さ…

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…

python-environment.elを使うのにvirtualenvを不要にする

python-environment.elというelispが、jediなどをemacsで使おうとした時に使われます (正確に言うと、emacs上でepc(emacs用のrpc) serverをつかったjediのinterfaceをインストールした際に使われる) 。 このpython-environment.elですが、python2.x系のこと…

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

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

githubで特定のownerの持つリポジトリを全部cloneしたい

github上で特定のownerの持つrepositoryを全部cloneしたくなった。 具体的にはjupyter関連のコードを雑に手元に持っておきたかった。以下のワンライナーで済む(ただし100個以下の場合)。 $ TARGETNAME=jupyter $ http -b --pretty=format https://api.github…

手触りの良いscript -- argparseとMakefileとiteratorの妙

手触りの良いscriptというものについて最近考えている。 ここでの手触りの良さとは何かというと粒度の自由さとアクセス性の良さに関するもの。別の言い方をするなら好きな形で扱え融通が効くようなもののこと。融通が効くというのはどういうことかと言えば、…

melpaからanything.elが消されている事に気づいた

melpaからanything.elが消されている事に気づいた。発端はたまたまEmacsの環境が壊れてしまって復旧しようとしていたときのこと。 PRが作られていて、もうanythingなんて誰も使っていないし移行したい人はhelmを使っているよねという内容。 Remove anything …

pythonでclassの階層関係がわかりにくいときに手動で良い感じに把握したいという試み

久しぶりにpythonの初歩的な話?をしたいと思ったので色々書いてみることにします。 すごく雑に言えば、pythonで、あるモジュールが何をやっているのかわからないという所からpydocを使えば良いかもしれないという話をしたり。 そこからpydocをプログラムとし…

pythonでCSVを消費する処理を再開可能にしたい

github.com はじめに CSVを消費する処理を再開可能にしたいという気持ちになりました。具体的には、1つ1つの処理にそこそこ時間が掛かる(30秒から1分)ものをそこそこ多く(104件くらい)処理しないといけないことがあったのですが。DBとか用意したり使ったり…

なぜmakeのeval,call,defineが欲しくなってしまうのか

なぜmakeのeval,call,defineが欲しくなってしまうのかについてぼーっと考えたりしてた(個人的な興味として、goのgithub.com/magefile/mageでmakeを置き換えられないかな−やっぱり無理かもみたいなものを考える上でmakeについてもう少しまじめに考える必要が…

apistarのJSON response でdatetimeを含んだdictを返しても大丈夫なようにする

apistarというdjango rest frameworkなどを作っている人たちが作っているフレームワークがある。まだ開発中。既存のpythonのフレームワークとは異なりapiサーバーの実装の方をデフォルトとしているのでちょっとしたものを作る分には便利。 このapistarでよく…

makefileのforeachのハマりどころ

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

kamidanaにsnakecase,camelCaseの変換や複数形に変換する機能を追加した

kamidanaにsnakecase,camelCaseの変換や複数形に変換する機能を追加した。 実行には以下のようにadditionalsの指定が必要。 $ kamidana -a kamidana.additionals.naming hello.jinja2 snake_case,camelCase 例から 時折、ファイルの種類によってsnake_caseだ…

go-bindataの代わりにstatikを使うことにした

以前はgo-bindataを使っていたのだけれど。そういえば、作者がアカウント削除したあとに他の人がリポジトリ作成したみたいなことがあったな−。ということを思い出したりしたので代替品を探してみることにした。 statikを使う。statikはこちら。 https://gith…

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

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

goでは自分自身を返すメソッドは定義しないほうが良いのでは?という話。

最近色々コードを書いていた中で、goでは自分自身を返すメソッドは定義しないほうが良いのでは?という思いを抱くことがあった。自分自身を抱えすメソッドを定義するということを一般に悪いとする主義主張の人もいたりもするけれど。そこまで強硬に主張した…

gomvpkg-lightというパッケージを作った

github.com 作りました。 発端 gomvpkg-lightみたいなものを作りたい理由は2つあって。1つ目が遅い。2つ目が常にpackageの指定が再帰的に扱われるのがちょっと困るという感じ。— po (@podhmo) 2018年4月6日 まとめると もう少し速さが欲しい packageを再…

go言語でASTの解析にgo/typesの機能を使うことの威力について

goはASTの解析が手軽なのが便利。ところでこれにgo/typesの機能を使うととても便利になる。その威力を一番わかりやすく体験できそうな例を思いついたので紹介する。 (実際にはgo/typesの機能の使いかたはこれいがいにも色々ある) go/types? go/typesとい…

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

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

コード生成用のツールに欲しいもの3 機能をバラバラに使いたい

はじめに (個人的なコード生成のための環境を作っている。まだ完成には程遠いので実際のチュートリアルなどは作らない) コード生成用のツールに欲しいものを思いつくままにあげていく。 機能をバラバラに使いたい 1,2ではあると便利なものをそのままあげたの…

コード生成用のツールに欲しいもの2 パッケージの情報の利用

はじめに (個人的なコード生成のための環境を作っている。まだ完成には程遠いので実際のチュートリアルなどは作らない) コード生成用のツールに欲しいものを思いつくままにあげていく。 パッケージの情報の利用 goの標準ライブラリににgo/typesという素晴ら…