環境
説明
プロジェクトでpipも含めてenvを更新しました。 その後、コマンドで古いパッケージをチェックしたかった:
pip list --outdated --format=columns
その後、例外が発生しました。
予想される行動
パッケージのリストまたは空のリストを期待していました。
再現する方法
pip list --outdated --format=columns
実行します出力
(env) project (develop) $ pip list --outdated --format=columns
ERROR: Exception:
Traceback (most recent call last):
File "/project/env/lib/python3.6/site-packages/pip/_internal/cli/base_command.py", line 188, in main
status = self.run(options, args)
File "/project/env/lib/python3.6/site-packages/pip/_internal/commands/list.py", line 156, in run
packages = self.get_outdated(packages, options)
File "/project/env/lib/python3.6/site-packages/pip/_internal/commands/list.py", line 164, in get_outdated
dist for dist in self.iter_packages_latest_infos(packages, options)
File "/project/env/lib/python3.6/site-packages/pip/_internal/commands/list.py", line 164, in <listcomp>
dist for dist in self.iter_packages_latest_infos(packages, options)
File "/project/env/lib/python3.6/site-packages/pip/_internal/commands/list.py", line 195, in iter_packages_latest_infos
best_candidate = evaluator.get_best_candidate(all_candidates)
File "/project/env/lib/python3.6/site-packages/pip/_internal/index.py", line 729, in get_best_candidate
best_candidate = max(candidates, key=self._sort_key)
File "/project/env/lib/python3.6/site-packages/pip/_internal/index.py", line 710, in _sort_key
has_allowed_hash = int(link.is_hash_allowed(self._hashes))
File "/project/env/lib/python3.6/site-packages/pip/_internal/models/link.py", line 213, in is_hash_allowed
return hashes.is_hash_allowed(self.hash_name, hex_digest=self.hash)
AttributeError: 'NoneType' object has no attribute 'is_hash_allowed'
@ptyneckiこの問題を提出していただきありがとうございます!
/ cc @cjerdonekは、コードベースのこの部分に取り組んでいて、私よりもよく知っているからです。
Windows 10、Python3.7.3で同じ問題
Ubuntu 18.04.2 LTS、Python3.6.8で同じ問題
macOS18.6.0とPython3.7.4で同じ問題
Windows 10、Python3.7.4で同じ問題
Fedora 29、Python3.7.3で同じ問題。
今のところ、回避策として、...
python3 -m pip install -UI --user 'pip<19.2'
pip
バージョン19.1.1を再インストールしました。 ただし、完全なコマンド出力は興味深いものです。
$ python3 -m pip install -UI --user 'pip<19.2'
Collecting pip<19.2
Using cached https://files.pythonhosted.org/packages/5c/e0/be401c003291b56efc55aeba6a80ab790d3d4cece2778288d65323009420/pip-19.1.1-py2.py3-none-any.whl
Installing collected packages: pip
Successfully installed pip-19.2
なぜSuccessfully installed pip-19.2
報告するのですか?
複数のOSでこれが発生していることを確認していただきありがとうございます。
皆さん、同じ問題に直面している場合は、追加のコメントを投稿しないでください。 GitHubのリアクションを使用して、最初の投稿に賛成し、問題をサブスクライブしてください。
そうすれば、メンテナはこの問題でこれを解決する方法について話し合うことができます-追加の「私も」コメントは誰にも役立ちません。
うーん、タイプチェッカーはここで失敗したと思います。 タイプアノテーションには、 hashes
はNone以外である必要があると記載されていますが、報告されているケースではNoneです: //github.com/pypa/pip/blob/369ec7c0a8a81a076ca5584c34c8530d7a30a220/src/pip/_internal/models/link .py#L202 -L209
簡単に見てみると、今のところ良い修正は、 Link.is_hash_allowed(hashes)
を更新して、 hashes
がNoneの場合にFalse
を返すことだと思います(そして、パラメーターを更新してアノテーションを整列させます〜 Optional[Hashes]
)。 hashes
引数が常に非None
であることを確認するために、おそらく複数の場所で物事を更新しようとするよりも、この時点でおそらくより簡単で確実です。タイプチェッカーに寄りかかって、100%確実に確認します。
タイプチェッカーはここで失敗したと思います。
ああ。 はい-strict_optionalはpip._internal.index
に対してFalseであり、これはまさにその失敗です。
タイプチェッカーに頼って100%確実に確認することはできないようです。
ええ、段階的に採用するためのこれらのフラグがある限り、完全に信頼することはできません。
ああ。 はい-pip._internal.indexのstrict_optionalはFalseであり、これはまさにその失敗です。
また、関数が定義されているmodels/link.py
でも、 strict_optional
有効になっています。
さて、これについてはPR#6774を投稿しました。
この問題は、この後の良いステップ(19.3の場合-パッチリリースではない)は、 index.py
に対してstrict_optional
オンにすることであることを示しています。
また、関数が定義されているmodels / link.pyでは、strict_optionalが有効になっています。
ええ-mypyは、呼び出しサイトのルールを使用して、呼び出しサイトでチェックを行います。
あなたの提案した修正とPRは私にはよく見えます。 他に問題が発生しない場合は、今日の夕方にバグ修正リリースを行うことができます。これから3〜5時間後です。
他に問題が発生しない場合は、今日の夕方にバグ修正リリースを行うことができます。これから3〜5時間後です。
それは素晴らしいことです。 どうもありがとうございました。
こんにちは。 FWIW19.2でこれとは関係のないバグを見つけたかもしれません。 私はまだそれを理解しようとしています、そして後で新しい問題を開きます。
編集:
ああ、誰かがすでに1つを開いていますhttps://github.com/pypa/pip/issues/6775
修正はマスターにあります。 リリースは少しやります。今日は長い一日を過ごした後、少し休憩します。
このバグ修正を含むリリースがアップロードされました。 みんな(そして特に@cjerdonek)に感謝します! :)
最も参考になるコメント
修正はマスターにあります。 リリースは少しやります。今日は長い一日を過ごした後、少し休憩します。