ラベル pyright の投稿を表示しています。 すべての投稿を表示
ラベル pyright の投稿を表示しています。 すべての投稿を表示

2026年1月12日月曜日

BasedPyright を pyright の設定に合わせる方法

BasedPyright を pyright の設定に合わせる方法

概要

pyrightconfig.json があるとそれを優先してしまうので basedpyright 用の設定ファイルを作成してそっちに記載します

環境

  • Ubuntu 24.04
  • code-server 4.107.0
  • basedpyright 1.37.1

basedpyrightconfig.json

{
  "typeCheckingMode": "basic",
  "reportUnknownParameterType": "none",
  "reportMissingTypeArgument": "none"
}

vscode 設定

  • settings.json
{
  "basedpyright.analysis.configFilePath": "./basedpyrightconfig.json"
}

最後に

pyrightconfig.json がある場合は注意しましょう

デフォルトは recommended なのですがそれだと pyright よりも厳しいようです

2025年3月19日水曜日

flask-sqlalchemy で pyright 用のスタブファイルを作成してみた

flask-sqlalchemy で pyright 用のスタブファイルを作成してみた

概要

flask-sqlalchemy + pyright を使っているとデータベースのモデルからインスタンスを生成する際に pyright のエラーになります
回避方法はいろいろありますが今回は pyright 用のスタブ情報を手動で作成することで対応してみました

環境

  • Python 3.12.9
    • flask-sqlalchemy 3.1.1
    • pyright 1.1.396

エラーの出るファイル

  • vim my_libs/schema.py
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()


class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), nullable=False)


# インスタンス作成
user = User(id=1, name="Alice")

これで pyright を実行すると以下のえらーになります
これをスタブを作成することで回避します

  • pipenv run pyright my_libs/schema.py
/path/to/my_libs/schema.py
  /path/to/my_libs/schema.py:12:13 - error: No parameter named "id" (reportCallIssue)
  /path/to/my_libs/schema.py:12:19 - error: No parameter named "name" (reportCallIssue)
2 errors, 0 warnings, 0 informations

スタブファイルの自動生成

  • pipenv run pyright --createstub flask_sqlalchemy

これで typings 配下に以下のファイルが自動で生成されます

ls -ltR typings                                   
total 0
drwxr-xr-x  12 user01  staff  384  3 18 10:22 flask_sqlalchemy

typings/flask_sqlalchemy:
total 120
-rw-r--r--  1 user01  staff    171  3 18 10:22 track_modifications.pyi
-rw-r--r--  1 user01  staff    710  3 18 10:22 table.pyi
-rw-r--r--  1 user01  staff   1428  3 18 10:22 session.pyi
-rw-r--r--  1 user01  staff   1870  3 18 10:22 record_queries.pyi
-rw-r--r--  1 user01  staff   3024  3 18 10:22 query.pyi
-rw-r--r--  1 user01  staff   5279  3 18 10:22 pagination.pyi
-rw-r--r--  1 user01  staff   5297  3 18 10:22 model.pyi
-rw-r--r--  1 user01  staff  14197  3 18 10:22 extension.pyi
-rw-r--r--  1 user01  staff    321  3 18 10:22 cli.pyi
-rw-r--r--  1 user01  staff    180  3 18 10:22 __init__.pyi

動作確認

スタブファイルを作成した状態で再度 pyright を実行しましょう
先のほどまで出ていた No parameter named "name" などのエラーが出ないことが確認できると思います

おまけ: その他の解決方法

__init__ メソッドを User モデルクラスに実装する

この方法でも pyright のエラー自体は出なくなりますがコンストラクタを生成することで初期化時の処理が変わる可能性があるのであまりおすすめはしないです

dict を使い変数展開する

User 生成時にキーワード引数ではなく辞書の展開を使ってもエラーを回避できます

params = {
  "id": 1,
  "name": "hawk"
}
user = User(**params)

最後に

flask-sqlalchemy の pyright エラーに対応してみました
typings/ ディレクトリは今回は自動生成しているので git には含めないほうがいいです
手動で作成している場合は含めたほうがいいです

CI などで typings が必要な場合は毎回生成してあげるようにしましょう

おまけ: スタブファイルの手動作成(失敗編)

以下試したけどダメだったパターンです

スタブファイルはプロジェクトルートの typings というディレクトリ配下に作成します
またパッケージの階層も同じにする必要がありかつファイル名は pyi ファイルにします

  • mkdir typings
  • mkdir typings/my_libs
  • vim typings/my_libs/schema.pyi
from flask_sqlalchemy import SQLAlchemy

db: SQLAlchemy

class User():
    id: int
    name: str

    def __init__(self, id: int, name: str) -> None: ...

2024年4月3日水曜日

pyright で dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.73.dylib

pyright で dyld: Library not loaded: usr local opt icu4c lib libicui18n.73.dylib

概要

Mac 上の pyright でタイトルのエラーが出たので対応しました

環境

  • Python 3.11.6
  • pyright 1.1.356
  • macOS 11.7.10

対応方法

  • brew reinstall node

To retry an incomplete download, remove the file above.

上位の reinstall 中に xz でエラーが発生したので対応しました

エラー文のその上に表示されているキャッシュファイルを削除する

ex)

  • rm /Users/kakakikikeke/Library/Caches/Homebrew/downloads/9a5d194e1a978ebb3dac37f12deaa4085d4d1016cb31bcbf54b7a60103c3e1e6--xz-5.6.1.tar.gz

そして再度 install する

  • brew update
  • brew reinstall xz

最後に

pyright は node なので node まわりのインストールを見直すと良いでしょう
スペックの低いマシンだと node reinstall にかなり時間がかかります (自分の場合1時間以上かかりました

2023年11月2日木曜日

Import "tensorflow.keras" could not be resolved 対策

Import "tensorflow.keras" could not be resolved 対策

概要

pyright で tensorflow.keras が解決できないときのワークアラウンドを紹介します
本当は公式に対応していただきたいところです

環境

  • macOS 14.0
  • Python 3.11.6
    • tensorflow 2.14.0

site-packages/tensorflow/init.py を修正

  • vim $(pipenv --venv)/lib/python3.11/site-packages/tensorflow/__init__.py

392 行目あたりの _keras_module の定義を以下のように分岐させます

import typing as _typing
if _typing.TYPE_CHECKING:
  from keras.api._v2 import keras
else:
  _keras_module = "keras.api._v2.keras"
  _keras = _LazyLoader("keras", globals(), _keras_module)
  _module_dir = _module_util.get_parent_dir_for_name(_keras_module)
  if _module_dir:
    _current_module.__path__ = [_module_dir] + _current_module.__path__
  setattr(_current_module, "keras", _keras)

keras フォルダを tensorflow 内へフォルダへコピー

  • cp -pr $(pipenv --venv)/lib/python3.11/site-packages/keras $(pipenv --venv)/lib/python3.11/site-packages/tensorflow/

あとは pyright を再起動すれば OK です
エディタの再起動でも OK です

最後に

面倒ですがこれで tensorflow.keras として pyright が認識してくれて補完やジャンプなどが行なえます
ちなみに pipenv update など行い tensorflow パッケージが更新された場合は再度同じ手順を実施する必要があります

参考サイト