Pip: AttributeError: объект 'NoneType' не имеет атрибута 'is_hash_allowed'

Созданный на 23 июл. 2019  ·  18Комментарии  ·  Источник: pypa/pip

Окружающая обстановка

  • версия пункта: 19.2
  • Версия Python: 3.6.8
  • ОС: Mac OSX (ядро Дарвина, версия 18.6.0)

Описание
Я сделал обновление env в своем проекте, включая pip. После этого я хотел проверить устаревшие пакеты с помощью команды:

pip list --outdated --format=columns

После этого возникло исключение.

Ожидаемое поведение
Я ожидал список пакетов или пустой список.

Как размножаться

  1. Получите последнюю версию пакета из PyPI.
  2. Затем запустите pip list --outdated --format=columns
  3. Произошла ошибка.

Вывод

(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'
lisshow auto-locked bug

Самый полезный комментарий

Исправление находится в мастере. Я сделаю релиз чуть позже - немного отдохну после долгого сегодняшнего дня.

Все 18 Комментарий

@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)! :)

Была ли эта страница полезной?
0 / 5 - 0 рейтинги