Open9

python linterメモ

quasarquasar

bandit

assertの利用を咎めてくる (B101).

assert文は-Oオプションで消えるので、絶対正しいことしか書いてはいけない。言い換えると、式が満たされないときはプログラムのバグということ。
ユーザ入力の誤りとか、ファイル操作の失敗とか、そういったことはassertではなく例外を使う。
また、式に副作用があるのも厳禁。

こういったことが守らないと危ないから咎められるのだろう。

quasarquasar

"Configuration"のドキュメントがひどい。
端的に

  • .banditはyamlではなくini(コマンドライン引数を設定した扱いになる)。
  • .bandit-rを使ってディレクトリ指定した場合か、--iniオプションでiniファイルを明示的に指定した場合にだけ読まれる
  • yamlで書くのは(bandit-config-generatorで生成されるのは)コンフィグの方で、これは-cで指定する
  • コンフィグで指定した内容はプロファイルとして設定した扱いになる。-pでプロファイルを指定できるとあるが、コンフィグで名前付きプロファイルを書く方法が全然わからない。"Usage"にある以下のコマンドは動かない
bandit examples/*.py -p ShellInjection

あまりにひどいのでPR出したいがひどい点が多すぎて書くのが大変。

quasarquasar

prospectorからbanditの警告を切るには:

  • bandit.disable:["..."]は当然無理
  • コンフィグを書いてbandit.options.configに渡すしかない
quasarquasar

vulture

prospectorからfalse positiveを止めるには

vulture:
  disable:
    - unused-function

とする。
pyproject.tomlを書いてもいいが、pathsにホワイトリストを入れるのは良くない気がする。

quasarquasar

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

しかしこうすると、今度はmypySelfについて怒る。
まあPEP 673はpython 3.11からなので致し方なし……。

quasarquasar

PEP 673に書いてある方法で両方に怒られないようにできる。

from typing import Protocol, TypeVar

TOrdered = TypeVar("TOrdered", bound="Ordered")


class Ordered(Protocol):
    def __lt__(self: TOrdered, _: TOrdered, /) -> bool:
        ...
quasarquasar

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とする場合は怒られない。なんだかな。