きり丸の技術日記

技術検証したり、資格等をここに残していきます。

Python

FastAPIのHTTPExcrptionはログに出しても空文字列の可能性がある

FastAPIでHTTPExceptionをログに出力しようとした時のメモ。 環境 Python 3.12.3 FastAPI 0.103.1 0.110.0 対応 少し古いFastAPIのライブラリなら、reprを使用してシリアライズしてください。もし、strで検証しても空文字列でなければ、そのままでも問題あり…

Pythonのjinja2でマルチパートメールのテンプレートを取得する

Pythonでマルチパートメールを送る方法をブログにしました。しかし、前回の記事はファイルからテンプレートを取得していないので、マルチパートメールを実質運用できません。今回はjinja2を使用してファイルからテンプレートを取得することで実運用できるよ…

Pythonでマルチパートメールを送る(smtplib)

Pythonでメールを送る方法を素振りしたかったのでメモします。SMTPを使用し、マルチパートメールを送るところまでを目標とします。 なお、実務ではSESを使用したり、SendGridを使用することが多いと思うので、あくまでローカルでメールの動作確認をする程度…

testcontainers-pythonでMinioを扱う

testcontainers-pythonでminioを使う際に少々手間どったのでメモに残します。 なお、この記事ではtestcontainers自体のメリット等については記載いたしません。 環境 Python 3.12 boto3 1.34.69 minio 7.2.5 testcontainers 4.1.1 ゴール boto3でminioに対し…

【Scrap】pytestについて

ZennのScrapsと同じような感覚の記事。間違っている可能性は十分にあります。 今回の記事ではpytestについて自分が調べたことをまとめます。 環境 Python 3.7.9 pytest 7.4.3 pytest-check 2.2.2 Pytestについて 処理順番 pytestではヒットした順番で順次テ…

Pythonのclassは暗黙的にobjectを継承している(reportMissingSuperCallの対応)

pyrightを使用している際に、reportMissingSuperCallが発生したので対応していました。 error: Method "__init__" does not call the method of the same name in parent class (reportMissingSuperCall) ただし、コード上は特に何も継承していません。 clas…

同じJSONやDictでも生成されるJWTは変わることがある(Pythonで例示)

同一のJSONやDictを与えているはずなのに、生成されたJWTが変わってしまったというメモ。 なお、ライブラリの特性である可能性はあるので、すべてのJWTライブラリで発生するわけではありません。 環境 Python 3.11 python-jose 3.3.0 原因 JSONやDictとして…

Pythonのエラーチェイン(例外を元に例外を投げる)には3種類あるがあまり気にしなくていい

Pythonでフレームワークから発生した例外を元に、適切に自作した例外に変換する方法に複数あることを知ったので、それを素振りしました。 なお、結果だけ先にお伝えするとraiseするだけでも9割問題ありません。 環境 Python 3.11.6 確認方法 Pythonでは単純…

FastAPIのpydanticの422UnprocessableEntityはExceptionのExceptionHandlerではキャッチできない

FastAPIで意図しないエラーが発生したときにExceptionでハンドリングしていましたが、それだけではpydanticで発生するエラーがキャッチできなかったのでメモします。 なお、pydanticはAPIのRequestとResponseのモデルで使用していますので、フロントのバリデ…

AnyIOのテストをasyncioだけで動かす(asyncioとtrioの2倍動かないようにする)

AnyIOを使用しているテストで、意図せずにasyncioとtrioの2つで動いてしまったテストがあったので、asyncioだけにした時のメモ。 環境 Python 3.11 AnyIO 3.7.1 Pytest 7.4.3 実装 conftest.pyに次の処理を入れると、asyncioだけが動きます。 @pytest.fixtur…

Pythonのenumはint等のプリミティブ型を継承すると便利

基本的には推奨されない書き方のようですが、使ってみて便利だったのでメモします。 環境 Python 3.12 実装 int等のプリミティブな型の継承は次のとおりです。 from enum import Enum class IntInheritEnum(int, Enum): ID = 1 # 列挙型ではなく、intとして…

Pythonの__iter__を素振りする(First Class Collection[FCC]で使えるかも)

Pythonではイテレータを簡単に作れます。もしかしたら何かに使えるかもしれないので、素振りします。 環境 Python 3.12 ゴール PythonのFCC(First Class Collection)にて、For文を使用する際にFCCのインスタンスのまま使用できること。 from typing import…

Pythonのデフォルト引数では配列ではなくNoneを使わないとダメ(ミュータブルはNG)

有名な話ですがハマったのでブログにします。 環境 Python 3.9 事象 Pythonでデフォルト引数に配列を定義すると、意図せずに同じインスタンスを使用してしまう。 def target_1(value, list=[]): list.append(value) return list def test_01(): a = target_1…

Pythonで配列から特定のキーだけで検索したい時は辞書型を経由すると速い

当たり前の話ではありますが。 Userクラスの配列からuser_idをキーに検索したい、emailをキーに検索したい等々の特定のキーがある場合、辞書型を経由すると非常に早く値を取得できます。 前提 Python 3.9 対応 配列を辞書型に変換する 最初にUserクラスを定…

SQLAlchemyでwhere条件を変数化し、動的に変数に条件を追加する(1でも、2でも使えるはず)

※ 一部再現しきれていないので、誤っている可能性があります。 前提 SQLAlchemy 2.0.11 ソースコードありません 1.4.32 対応 次のどちらかで対応できます。 配列にand_インスタンスを設定し、最後に*で展開する ※ 2.0.11, 1.4.32でも確認できています。 crit…

PythonでJSONを一部項目を無視して比較したい(I want to compare JSON in Python while ignoring certain items by deepdiff)

PythonでJSONを比較したいという記事を過去に書きました。しかし、日付項目等々の固定しづらい項目を無視して比較するというユースケースが達成できていませんでした。 今回の記事では、一部項目を無視して比較する方法を記載します。 前提 Python 3.11 Deep…

Pythonでメソッド呼び出し元がNoneパラメータを渡さないようにする(doesn't call none parameter in Python)

メソッド呼び出し元で引数が指定されていない場合は、デフォルト値を与えられます。キーワード引数を使用すると、任意のパラメータに値を与えられます。 ただし、意図的にメソッド呼び出し元でNoneを渡してしまった場合、デフォルト値を使用できません。 今…

Pythonの辞書型の値がNoneならキーを削除する(value-is-none-so-remove-key-in-Python-dictionary)

辞書型の値がNoneの場合に、キーを削除したいことがあったので残します。 前提 Python 3.11 対応 辞書型の値がNoneのとき、キーを削除するのは次のコードです。 {k: v for k, v in dict.items() if v is not None} dict = {"a": "1", "b": "2", "c": None} a…

Pythonで関数とNoneの型ヒントをつけたい(Resolve TypeError: unsupported operand type(s) for |: 'function' and 'NoneType')

Pythonで関数とNoneが取りうるパラメータに対して、Union型で型ヒントを与えようとしたところエラーになったので解決方法をメモします。 環境 Python 3.9 対応 Union型を使わずに、Optional型でヒントを与えます。今回ハマっていたのは、sqlalchemyでand_条…

Pytestにてネストしたテストケースを作成する

JUnit 5だと@Nestedアノテーションを付与すると、テストクラス内にさらにテストクラスを用意できます。 Pytestでも同様にテストクラスをネストさせたかったのですが、ググってもすぐには出てこなかったので、自分のブログにまとめます。 環境 Pytest 7.1.1 …

Pythonで初期配列をset型で作りたければbrace {} リスト型はbracket []

小ネタ。いつもset([data for data in datum])のように、List型を経由してたので、備忘録。なお、タイトルの出オチ記事です。 環境 Python 3.8 対応 ブレース(brace, {})でくくると、set型になります。 ブラケット(bracket, [])でくくると、list型になり…

Pythonで可変長引数のメソッドに配列を渡したい(位置引数、positional argument)

Pythonで可変長引数のメソッドしか用意されていないものの、処理上は配列にしてパラメータを渡すしかないことがあります。 今回の記事では、配列を可変長引数に渡せるようにする方法を残します。 環境 Python 3.9 方法 配列の変数に対して*を付与すると、可…

途中に余計なBOMが付与されたファイルが作成された(FastAPI, StreamingResponse, Generator)

PythonのFastAPIのStreamingResponseでGeneratorを使用しながら、UTF-8 BOMのファイルをダウンロードさせるAPIを作成しました。ただ、作成したファイルを確認したところ、ファイルの途中で余計なBOM(\ufeff)が付与されてしまっていました。 今回の記事では…

【障害メモ】PythonのSQLAlchemyを使用したテストコードで参照系処理を2回実行したら2回目で不具合発生

掲題の事象が発生しました。結論を出すと、ただの私の認識誤りです。ただ、よくある内容ですので、二度目が発生しないようにメモします。 Pythonと記載していますが、同様の条件が揃えば他のライブラリでも発生しうる内容です。JavaのMyBatisでも似た事象は…

PythonでJSONを比較したい(I want assert JSON by Python)

環境 Python 3.9 ユースケース PythonでAPI開発を行い、レスポンスのJSONを比較したい。 次のJSONが等価であることを期待する。 { "id": 100, "name": "kirimaru" } { "name": "kirimaru", "id": 100 } できていないこと ソート順を無視したJSONの配列の比較…

Pythonでインスタンスが自作型ではなく、組込み型(built-in types)であることを判別する(isinstance)(primitive types)

Pythonにて処理する際のインスタンスが組込み型(built-in types)であることを判別したかったのですが、簡単にはできませんでした。もし、簡易にできるようになったら、教えてください。 なお、組込み型(built-in types)とは、Pythonが定義しているstr, i…

ReadOnlyなDocker環境のPytestを実行するとNo such file or directoryが発生した

pytestの起動時に失敗するので、原因を把握するのに時間がかかってしまいました。 環境 Docker Docker version 20.10.13, build a224086 Docker Compose docker-compose version 1.29.2, build 5becea4c Windows Macだと発生しない事象のようです 前提 Docke…

PythonでEnumをfor文で回したら値をすべて出力しなかった

パラメータの値を元に、PythonのEnumで定義した値を取得するメソッドを作ろうとしました。しかし、PythonのEnumの知識が弱かったため、事前に定義していたEnumをすべて取得できない事象が発生しました。 この記事では、PythonのEnumの仕様を確認して、Enumで…

Pytestでコマンドオプションからパラメータを渡す

Pytestでコマンドのオプションからパラメータを渡すことができないか調べたときのメモ。似た記事はたくさんありますので、詳しいことは参考情報を見てください。 環境 Python 3.8.10 pytest 6.2.4 ゴール Pytestのコマンドオプションからパラメータを渡し、…

【Pytest】不安定なテストに失敗したら自動リトライさせる(flaky)

以前、Javaで不安定なテスト(flakyなテスト)をリトライさせるライブラリを素振りしました。今回の記事はPython版です。 Pytestの公式ページにてFlakyなテストに対する解決策となるライブラリを複数提示されており、その中でもGitHubのStar数が一番多かった…