python linterメモ
https://zenn.dev/quasar/scraps/a4e6bf32cc5b26 でlinterを色々入れたので、使用感をまとめてみる。
bandit
assert
の利用を咎めてくる (B101).
assert
文は-O
オプションで消えるので、絶対正しいことしか書いてはいけない。言い換えると、式が満たされないときはプログラムのバグということ。
ユーザ入力の誤りとか、ファイル操作の失敗とか、そういったことはassert
ではなく例外を使う。
また、式に副作用があるのも厳禁。
こういったことが守らないと危ないから咎められるのだろう。
"Configuration"のドキュメントがひどい。
端的に
-
.bandit
はyamlではなくini(コマンドライン引数を設定した扱いになる)。 -
.bandit
は-r
を使ってディレクトリ指定した場合か、--ini
オプションでiniファイルを明示的に指定した場合にだけ読まれる - yamlで書くのは(
bandit-config-generator
で生成されるのは)コンフィグの方で、これは-c
で指定する - コンフィグで指定した内容はプロファイルとして設定した扱いになる。
-p
でプロファイルを指定できるとあるが、コンフィグで名前付きプロファイルを書く方法が全然わからない。"Usage"にある以下のコマンドは動かない
bandit examples/*.py -p ShellInjection
あまりにひどいのでPR出したいがひどい点が多すぎて書くのが大変。
prospectorからbanditの警告を切るには:
-
bandit.disable:["..."]
は当然無理 - コンフィグを書いて
bandit.options.config
に渡すしかない
似たようなissueがあったのでコメントした https://github.com/PyCQA/bandit/issues/606#issuecomment-1077323898
vulture
prospector
からfalse positiveを止めるには
vulture:
disable:
- unused-function
とする。
pyproject.toml
を書いてもいいが、paths
にホワイトリストを入れるのは良くない気がする。
mypy
vs Pylance
以下のコードは、mypy
は許すが、Pylance
は許さない。
from typing import Protocol
class Ordered(Protocol):
def __lt__(self, _) -> bool:
...
a: Ordered = 0
int.__lt__()
のシグネチャが(__x: int, /) -> bool
だからだそうだ。@runtime_checkable
してもダメ。
mypy
は気にしない。
Pylance
を納得させるにはPEP 673を使う必要がある。
from typing import Protocol
from typing_extensions import Self
class Ordered(Protocol):
def __lt__(self, _: Self, /) -> bool:
...
a: Ordered = 0
しかしこうすると、今度はmypy
がSelf
について怒る。
まあPEP 673はpython 3.11からなので致し方なし……。
PEP 673に書いてある方法で両方に怒られないようにできる。
from typing import Protocol, TypeVar
TOrdered = TypeVar("TOrdered", bound="Ordered")
class Ordered(Protocol):
def __lt__(self: TOrdered, _: TOrdered, /) -> bool:
...
mypy
vs Pylance
round 2
以下のコードは、mypy
は怒るが、Pylance
は許す。
a = ("a", "b", "c")
b = tuple(map(str, range(10)))
a = b
Line: 3
mypy: error / Incompatible types in assignment (expression has type "Tuple[str, ...]", variable has type "Tuple[str, str, str]") (col 5)
これはまあ、("a", "b", "c")
と書いた時点で型ヒントつけてあげるべきのような気もするが、汲み取ってくれるPylance
のほうが嬉しいかな。
ちなみに逆にb = a
とする場合は怒られない。なんだかな。