python

docker上でpip installのcache-dirが効くようにする方法を調べてみた

以下の記事の続き。 pythonのバッチ用のイメージを作りたくなったのでサイズがどれくらいになるか調べてみた - podhmo's diary 調べてみたところ、どうやらbuildkitの機能を使うと行けるらしいという事がわかったので色々調べてみた。 python - Using a pip …

windows上のpythonでカジュアルにopen()したら UnicodeDecodeError: 'cp932' codec can't decode byte が出た話

windows環境での作業でなるほどと思ったのでメモ。 自作のスクリプトをwindows環境で動かしたら動かなかった。以下のようなエラーメッセージが出る。 UnicodeDecodeError: 'cp932' codec can't decode byte 0x81 in position 59: illegal multibyte sequence…

pipxのススメ

pypa.github.io pipxという名前を聞いてまたpythonの新しいパッケージ管理のツールと思うかもしれないけれど、少しだけ用途が違う。これがほしい場合がある。 pipxは例えばpoetryやpipenvとはちょっと用途が違う。 pipxは日常生活のためのCLIコマンドのため…

pip-chillのススメ

pypi.org pip freeze で出力されるすべてをrequirements.txtに書く1のではなく、依存の一番外側のパッケージだけを出力したい事がある。そういうときにはpip-chillが便利。 実行例 例えば、fastapiを参考に以下の様なrequirements.txtを用意してみる。 requi…

pythonで7-digitsなマイクロ秒を含んだ文字列をstriptimeでdatetimeオブジェクトにしようとしてハマった話

時刻を文字列表現にするときにマイクロ秒を含んだ表現の場合がある。例えばgithub actionsのログは以下のようなもの。 lint Set up job 2021-05-25T20:31:24.8848799Z Current runner version: '2.278.0' 2021-05-25T20:31:24.8848799Z 部分が時刻の表現。実…

goやpythonで複数のパッケージをmonorepo的に1つのrepositoryで管理する方法について調べていた

調べていたのでメモ。作業結果は以下のリポジトリにある。 github.com どういうときに欲しくなるか? どういうときに欲しくなるかと言うと、複数の関心事のそれぞれに対して複数の環境への共通の対応をしたくなったとき。その上その複数の関心事というのが曖…

enumとdataclassを含んだ値をserialize/deserializeするためにjsonpickleを使う

以前の記事の続き。 enumとdataclassesを含んだ値をテキトーにJSONとしてseiralize/deserializeしたい - podhmo's diary 何も頑張って自作せずともjsonpickleを使えば良いかもしれない。 github.com import dataclasses import enum import jsonpickle class…

pythonのargparseのオプションと関数の引数の乖離を実際の処理を呼ばずに確認する方法を考えてみる

argparseをそのまま使うと以下の様な形になる。色々な書き方があるが、個人的にはflag部分はキーワード引数を使った関数定義にして、parse_args()で返ってきた値をそのまま使わずに**paramsで適用する形が好み。 def hello(*, name: str) -> None: print(f"h…

pythonで**kwargsにもう少し細かく型を付けたい

例えば以下の様な関数helloがあるとする。可変長引数を使って定義されている。とてもtrivialな例ではあるけれど説明用なので。。 from typing import Any def greet(prefix: str, *, name: str) -> None: print(f"{prefix}, {name}") def hello(**params: An…

enumとdataclassesを含んだ値をテキトーにJSONとしてseiralize/deserializeしたい

昔に似たようなタイトルの記事を書いていましたが、これとはちょっと違った内容です。 datacalssesのインスタンスを含んだ値をJSONにするときのメモ enumやdataclassesを含んだ値をテキトーにJSONとしてserialize/desserializeしたくなった。パフォーマンス…

pythonのバッチ用のイメージを作りたくなったのでサイズがどれくらいになるか調べてみた

これはかなり個人的なメモ。 コンテナ経由でpythonで作ったバッチを実行しようと思った。そしてイメージのサイズがどれくらいかを大まかに知りたくなった。そんなわけで調べてみた。 サイズを極限まで絞りたいと言う気持ちはなかったのでdistrolessなどは省…

複数のファイルを利用したpythonスクリプトを1つの実行可能なzipファイルにまとめる方法のメモ

pythonのscriptを1つのファイルにまとめたい。そのような場合にはzipappの機能が使えるかもしれない。 zipファイルとして1つにまとめたファイルはpythonインタプリタで直接実行できる。 このモジュールは Python コードを含む zip ファイルの作成を行うツ…

pythonでモジュールにversion情報を含めたい場合の方法のメモ

個人的には、pythonでパッケージを公開するときに、モジュールにバージョン情報を含めるのが好きではなかった。setup時のimportエラーなどが起きうる可能性を考えて。 ただ、たまたま要望されたのでその方法を調べてみたところ、手軽に扱えるようになってい…

pythonでyield先で起きた例外をyield元で取り扱いたい

「pythonでyield先で起きた例外をyield元で取り扱いたい」というようなことを言っていた。いろいろ調べ直してまとめてみたらgenerator周りの復習になったのでそのメモ。 課題 yeild先で起きた例外をyield元で取り扱いたい?とはなにか? def _use(i): if i %…

pythonでbreakpointなしに例外の発生元で自動的にpdbする方法のメモ

デバッガーを使いたいがコードにbreakpoint を仕込むのが面倒な時がある。 例 例えば以下のようなコードがあるとして、 foo > bar > boo と辿っていた中でのbooでpdbを実行して欲しい。 def foo(): print("foo") bar() print("foo") def bar(): print("bar")…

processを立ち上げまくる機会を避けるための簡単なRPCのメモ

時折、特定の前処理の一部として、1つのファイルを受け取る1つのスクリプトが何個も連鎖することがある。このようなときに都度都度processが立ち上がると、ほとんどの時間がimport timeで辛いということが起きる事がある。 以前書いた記事の中では、この辺…

awscliのコマンドの補完の遅延にイラッとしたので速くすることを考えてみた

はじめに awsのCLIとしてawscliがある。version 2を使ってくれと書かれていたりはするものの、この記事はversion 1。まぁそこまで大差はないと思う。 補完を有効にしなかった場合には、どのコマンドを使えば良いかの確認に aws help を使い、どのサブコマン…

PEP593のAnnotatedでwrapされた型ヒントからmetadataを取り出す

Annotated PEP593で型ヒントにmetadataを付けられる様になった。 例えば、関数の型ヒントを見てCLIのコマンドを生成するようなフレームワークがあったとして、コマンドラインオプションのヘルプメッセージ用の文字列も保持したい。以下のコード上での --name…

pythonのslackclientで非同期タスクを実行したらValueErrorになった話

最近「ちょっとslack botでも書くか」と思う機会があった。そのときに色々思うことがあったのでメモ。 slack botを書く機会があった。どのライブラリを使うのが良い? 現状ではslack自身が出しているライブラリをそのまま使うのが良いのではないかと思う。 g…

スプレッドシートを設定ファイルとして使うライブラリを作ってみた

github.com slackやdiscordなどのbotを作るときに、ファイルを触れない人にも設定をいじってもらおうとしたら、スプレッドシートあたりが無難なのかなと思いました。そんなわけでスプレッドシートを設定ファイルとして使うライブラリを作ってみました。 イン…

pythonの型定義を使ってOpenAPI docを出力してみる。

今回は以前のprotobufの出力を試した記事のOpenAPI doc版。 pythonの型定義を使ってprotobufを出力してみる。 近年のOpenAPIの状況 近年では、openAPIとの付き合い方もだいぶ落ち着いてきて、夢を見た機能を実装し切るというような気持ちのところは減ってき…

コード生成中に、裏側でサービスを立ち上げて、通信してあげればN+1を防げる事に気づいた

github.com コード生成でのN+1? 以前に、コード生成でのN+1問題の発生というような記事を書いた。 コード生成におけるN+1問題とbulk actionとしてのegoist。あるいはMakefileについて この記事では、bulk action的な実行を解として説明をしていた。元々の問…

egoistでモジュールを分割できるようにした

github.com 定義が多くなってくると、1つのファイルで管理するのが厳しくなってくる。そんなわけで、moduleを分割することを考えてみた。似たような機構はいろいろなWAFにも存在する。例えばflaskならblueprint、fastAPIならAPIRouter。 Flask -- Modular A…

コード生成におけるN+1問題とbulk actionとしてのegoist。あるいはMakefileについて。

例えば以下の画像の様な依存関係でコード生成1が行われるとする。入力となるファイルが幾つかあり、例えばjinja2のテンプレートなどで出力先の表現が記述されていて、これによりちょっとしたgoのコードやopenAPI docの一部を生成するというようなタスク。 画…

サブコマンドをincludeで自由に追加できるようにした

github.com サブコマンドをincludeで自由に追加できるようにした。 デフォルトで利用できるサブコマンド 例えば egoist init clikit で生成されるdefinitions.pyは以下の様なサブコマンドを持っている。 describe generate scan usage: definitions.py [-h] …

-hや--helpでのヘルプメッセージの表示は一瞬で終わってほしいと言う話

egoistを作っていて、けっこう気にしているポイントなども記事にしてみることにする。個人的には-hや--helpに時間が掛かるCLIはあまり好きではない。 具体的には0.5sくらいでちょっとストレスを感じ、1.0sを越えると、使うたびに感じるストレスがそのツール…

pythonのクラス定義からUnmarshalJSON()でのvalidation付きのgoのstruct定義を生成する

github.com pythonのクラス定義からUnmarshalJSON()でのvalidation付きのgoのstruct定義を生成してみる。(より細かなバリエーションは https://github.com/podhmo/egoist/tree/master/examples/e2e/generate-structkit にある) なぜUnmarshalJSON()付きで…

egoistで生成するCLI定義のカスタマイズ方法について

github.com 作っていたミニフレームワークの最初のバージョンをリリースしたと言う話という記事を書きました。 goはランタイムというミニフレームワークのプロトタイプをpypiにアップロードした とはいえ、この記事だけだと何が何だか分からなかったので、作…

goはランタイムというミニフレームワークのプロトタイプをpypiにアップロードした

github.com 以下の記事のミニフレームワークのプロトタイプが動くようになったので、0.0.1をpypiにアップロードしました。 goはランタイムという発想のミニフレームワークを作り始めた このプロトタイプに含まれる機能はCLIの定義を手軽にすると言う部分です…

pythonの型定義を使ってprotobufを出力してみる。

この記事の作業の一環で、pythonの型定義の情報を使いprotobufを出力することを試してみた。 goはランタイムという発想のミニフレームワークを作り始めた 基本的にはアイデアスケッチのようなもので、ちょっとしたコード辺を書いてみて、上手く期待する機能…