前置き
responder、FastAPI。
いいですよねぇ。
アルゴリズム書くくらいしか能がないと思っていたPythonでしっかりWebサービスが作れます。
しかし歴史が浅いことと、フルスタックフレームワークでないこともあって若干敷居が高いのか、記事はまだ少ない印象があります。
小ネタですが日本語の回答がなかったので、Pythonマイクロサービスにぎやかしのため投稿しておきます。
現象
SQLAlchemyを利用しているとPyLintに
Instance of 'session' has no 'add' user'
のような感じで怒られる。
VSCodeで実行しているので自動的にLinterは働き、詳しいエラートレースは見ていないが、検索してみるとエラーコードは、E1101
らしい。
ちなみにresponderやFastAPIはドキュメントを見る限り、標準でORMの機能を実装していないため、自分で好みのライブラリをimportしてくる必要があり、たまたま自分はresponderとDBの繋ぎ込みにSQLAlchemyを選択した。
したがってresponderに限らず、FastAPIなどのマイクロサービス、生でSQLAlchemyを使用する場合でも同様の現象が発生すると思われる。
RDBMSを使うのは既に人類として認められていないと言われているわけでは無いと信じたい。
解決法
検索すると、
pip install pylint-django
をしろとか
pip install pylint-flask
しろとか言われる。
しかし自分はdjangoを使っているわけでもflaskを使っているわけでもない。
適当に--extension-pkg-whitelist
にsqlalchemy
を入れてみてもヒットしなかった。
結論を言うと、setting.jsonに
"python.linting.pylintArgs": [
"--load-plugins",
"pylint_flask_sqlalchemy"
]
を追加すると解決した。
pipとかは要らなかった。
pip freeze
でもこのパッケージは存在しないので、新しいpipなりVSCodeとは情報が違うのかも。
あと--load-plugins
のsqlalchemyの引数名分かりにくいよ。
responderやFastAPIではありがちなことだけど、responderで検索しても出てこなくなっちゃうじゃん。
この記事もタイトルにresponderと入れるかどうか迷ったけど、「flaskでSQLAlchemy使っていたらVSCodeに怒られた」とか時代遅れな情報ばかりなので入れることにしました。
フクザツ!
--load-plugins
の引数pylint_flask
に関しては無駄なLinterの挙動を抑えるためresponderでは使わない方がいいと思いますが、flaskな人はこの引数だけでもいけるっぽいです。
※注
この問題は比較的最近も議論されていたようなので環境ややりたいことによって解決方法変わるかもです。
詳細な議論は以下参照。
https://stackoverflow.com/questions/53975234/instance-of-sqlalchemy-has-no-column-member-no-member
あとがき
IDEによるPythonのコード解析は非常に素晴らしいのですが、ライブラリや相対importの相手が見つからないよ問題はなかなか厄介ですね。
まあPythonに限った話では無いと思いますが。
その日のうちに追記
pylint_flask_sqlalchemyでエラーが出なくなったのはいいものの、型付言語のように未使用の変数をチェックしてくれる機能まで除去されていた。
個人的にこれは欲しいところ。
また調べると、pylint_sqlalchemyというプラグインもあるが、これをpipしたりjsonに記述したりしてもflask版との差がわからなかった。
ある程度雑なlintで良ければプラグインで良いかもしれないが、結局のところカレントディレクトリのpylintrcを編集するのが一番なのかもしれない。
個人的には差し当たってresponderの場合、デフォルトに以下の設定を追加するのが幸せなのではないかと思いました。
disable=xxx # 色々
unused-argument, # コントローラの引数reqなど使わないものが多いので
invalid-name, # pandasやnumpyなどsnake-caseのルールに合致しない命名が一般的なものが多いため
missing-docstring, # docstring書かないことも多いので
no-member # sqlalchemyなどライブラリの読み込みエラーを抑止するため
この辺りはmypyやpyrightとの兼ね合いもあるので個々人の好み。
やはりOSSは普及しなければ。