python

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系のこと…

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

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

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

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

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

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

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

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

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

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

pipenvの起動を早くしたという話のimport timeの確認を3.7以前の頃はどうしてたかという話

pipenvの起動を早くしたという話です。良い話ですね。 https://dev.to/methane/how-to-speed-up-python-application-startup-time-nkf ところでリンク先の記事はpython3.7で導入されるPYTHONPROFILEIMPORTTIMEの紹介なのですが。古の民(3.7以前の人々)はどの…

個人的なpythonのformatter(yapf)のコマンドをpypiにuploadした。

個人的なpythonのformatter(yapf)のコマンドをpypiにuploadした。githubにだけおいておいてインストールするのが結構めんどくさくなったので。とは言え個人的なものであることは間違いないのでなるべく名前がかぶらないようにユニークなprefixなどを付けて公…

新年最初のコードはalchemyjsonschemaを1年ぶり位に弄ることだった

新年最初のコードはalchemyjsonschemaを1年ぶり位に弄ることだった。 alchemyjsonschema sqlalchemyのmodelの定義から対応する感じのjsonschemaを生成するコマンド(ライブラリ)。去年くらいにjsonschemaではなくswaggerをdefaultにした。 やったこと やった…

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

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

reqtraceにrequestを良い感じに返す機能を追加した(httpbin的なもの)

github.com reqtraceにrequestを良い感じに返す機能を追加した。https://httpbin.org/ のようなもの。 直接何か色々触りたいときとかに欲しくなったりするので。 server 44444で立ち上げる。portを指定しなかった場合にはテキトウに空いているportを探す。 $…

reqtraceというものを作り始めた

github.com reqtraceというものを作り始めた。まだ作り途中なのでpypiなどには公開していない。 これは何? mock serverへrequestをすげ替えてreplayしたい reqtraceはrequest tracerの略。http requestとresponseをtraceしたいというのが目的。本来こういう…

jqfpyのgetにちょっとだけ機能を追加した `get('[]/x/ys[]/z')`。

github.com jqfpyのgetにちょっとだけ機能を追加した。具体的には、入力がリストの場合の処理を追加した。 例えば、こういうデータのnameだけとか。skillsのnameだけを取りたい場合にリスト内包表記になってしまうのがちょっとだけだるかった。 [ { "name": …

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まで含めて置き換え前のものと同じかどうか確認したい。 例えば、存在しない属…

dictknifeにdictmapを追加してみた

github.com はじめに dictknifeにdictmap()を追加してみた。 round dict 例えばstack overflowのこの質問に対する回答がシンプルになる。 https://stackoverflow.com/questions/32434112/round-off-floating-point-values-in-dict これを d = [ { 'A': 0.700…

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

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

csvのheaderを気にしてOrderedDictで読む方法

問題 例えば以下のようなcsvがあるときに、読み込んだ後にcsvのheaderの順序を保持してほしいという場合がある。 "age" "name" "20" "foo" カジュアルに以下の様なコードで読んだ場合に順序は不定。 import csv import sys r = csv.DictReader(sys.stdin, de…

logging入門

長すぎにならない程度に使い方をまとめてみる。 loggingの使い方 ライブラリの利用者 既に存在するアプリを実行するファイルの場合 if __name__ == "__main__": import logging logging.basicConfig(level=logging.DEBUG) # or INFO or WARNING or ERROR run…