Окружающая обстановка
Описание
Я сделал обновление env в своем проекте, включая pip. После этого я хотел проверить устаревшие пакеты с помощью команды:
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, Python 3.7.3
Та же проблема в Ubuntu 18.04.2 LTS, Python 3.6.8
Та же проблема в macOS 18.6.0 и Python 3.7.4
Та же проблема в Windows 10, Python 3.7.4
Та же проблема в Fedora 29, Python 3.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
?
Спасибо за подтверждение того, что это происходит на нескольких ОС!
Ребята, если вы столкнулись с той же проблемой, пожалуйста, не публикуйте дополнительные комментарии. Пожалуйста, используйте реакции GitHub, чтобы проголосовать за первое сообщение и подписаться на выпуск.
Таким образом, сопровождающие смогут обсудить, как решить эту проблему в этой проблеме - дополнительные комментарии «я тоже» никому не помогут.
Хм, я полагаю, здесь нас провалила проверка типов. В аннотации типа указано, что hashes
должно быть None, но в описанных случаях это None: https://github.com/pypa/pip/blob/369ec7c0a8a81a076ca5584c34c8530d7a30a220/src/pip/_internal/models/link .py # L202 -L209
После беглого взгляда я думаю, что на данный момент хорошим решением может быть обновление Link.is_hash_allowed(hashes)
чтобы вернуть False
если hashes
равно None (и привести аннотацию в соответствие, обновив параметр в Optional[Hashes]
). На данном этапе это, вероятно, проще и надежнее, чем пытаться обновить что-то, возможно, в нескольких местах, чтобы гарантировать, что аргумент hashes
всегда не None
, тем более что мы не можем положитесь на средство проверки типов, чтобы подтвердить со 100% уверенностью.
Полагаю, здесь нас провалила проверка типов.
Аааа. Ага - strict_optional имеет значение False для pip._internal.index
и это именно та ошибка.
мы не можем полагаться на средство проверки типов, чтобы подтвердить со 100% уверенностью.
Да, мы не можем полностью полагаться на это, пока у нас есть эти флаги для постепенного внедрения.
Аааа. Ага - strict_optional имеет значение False для pip._internal.index, и это именно та ошибка.
И хотя в models/link.py
где определена функция, включен strict_optional
.
Хорошо, я разместил для этого PR # 6774.
Эта проблема говорит мне, что хорошим шагом после этого (для 19.3 - не для выпуска патча) будет включение strict_optional
для index.py
..
И хотя в models / link.py, где определена функция, включен strict_optional.
Да - mypy выполняет проверки на сайте вызова, используя правила на сайте вызова.
Ваше предложенное исправление и PR мне нравятся. Если мы не увидим никаких других проблем, я могу выпустить исправление сегодня вечером - через ~ 3-5 часов.
Если мы не увидим никаких других проблем, я могу выпустить исправление сегодня вечером - через ~ 3-5 часов.
Это было бы прекрасно. Большое вам спасибо за это.
Здравствуйте. FWIW Возможно, я обнаружил ошибку в 19.2, которая не связана с этой. Я все еще пытаюсь разобраться и позже открою новый выпуск.
РЕДАКТИРОВАТЬ:
Ах, кто-то уже открыл https://github.com/pypa/pip/issues/6775
Исправление находится в мастере. Я сделаю релиз чуть позже - немного отдохну после долгого сегодняшнего дня.
Выложен выпуск с этим исправлением ошибки. Спасибо всем (и особенно @cjerdonek)! :)
Самый полезный комментарий
Исправление находится в мастере. Я сделаю релиз чуть позже - немного отдохну после долгого сегодняшнего дня.