Pip: AttributeError: el objeto 'NoneType' no tiene atributo 'is_hash_allowed'

Creado en 23 jul. 2019  ·  18Comentarios  ·  Fuente: pypa/pip

Medio ambiente

  • versión pip: 19.2
  • Versión de Python: 3.6.8
  • SO: Mac OSX (Darwin Kernel Versión 18.6.0)

Descripción
Hice una actualización de env en mi proyecto, incluido pip también. Después de eso, quería verificar los paquetes obsoletos con el comando:

pip list --outdated --format=columns

Después se planteó esa excepción.

Comportamiento esperado
Esperaba lista de paquetes o lista vacía.

Cómo reproducir

  1. Obtenga la versión más reciente del paquete de PyPI.
  2. Luego ejecuta pip list --outdated --format=columns
  3. Ocurre un error.

Salida

(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

Comentario más útil

La solución está en master. Haré el lanzamiento en un momento, descansando un poco después de un largo día de hoy.

Todos 18 comentarios

@ptynecki ¡ Gracias por presentar este problema!

/ cc @cjerdonek ya que ha trabajado en esta parte del código base y está más familiarizado con él que yo.

Mismo problema en Windows 10, Python 3.7.3

Mismo problema en Ubuntu 18.04.2 LTS, Python 3.6.8

Mismo problema en macOS 18.6.0 y Python 3.7.4

Mismo problema en Windows 10, Python 3.7.4

Mismo problema en Fedora 29, Python 3.7.3.

Por ahora, como solución alternativa, ...

python3 -m pip install -UI --user  'pip<19.2'

reinstalado pip versión 19.1.1. Aunque, la salida completa del comando es curiosa.

$ 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

¿Por qué informa Successfully installed pip-19.2 ?

¡Gracias por la confirmación de que esto ocurre en varios sistemas operativos!

Amigos, si tienen el mismo problema, no publiquen comentarios adicionales. Utilice las reacciones de GitHub para votar a favor de la primera publicación y suscribirse al problema.

De esa manera, los mantenedores podrían tener una discusión sobre cómo resolver esto en este problema; los comentarios adicionales "yo también" no ayudarán a nadie.

Hmm, supongo que el verificador de tipos nos falló aquí. La anotación de tipo dice que hashes debe ser None, pero es None en los casos informados: https://github.com/pypa/pip/blob/369ec7c0a8a81a076ca5584c34c8530d7a30a220/src/pip/_internal/models/link .py # L202 -L209

Después de un vistazo rápido, creo que una buena solución por ahora puede ser actualizar Link.is_hash_allowed(hashes) para devolver False si hashes es Ninguno (y alinear la anotación actualizando el parámetro a Optional[Hashes] ). Eso es probablemente más simple y más seguro en este punto que intentar actualizar las cosas en varios lugares posiblemente para garantizar que el argumento hashes siempre no sea None , especialmente porque parece que no podemos Apóyese en el verificador de tipos para confirmar con 100% de certeza.

Supongo que el verificador de tipos nos falló aquí.

Ahhh. Sí, estricto_opcional es falso para pip._internal.index y este es exactamente ese error.

Parece que no podemos apoyarnos en el verificador de tipos para confirmar con un 100% de certeza.

Sí, no podemos confiar completamente en él, siempre que tengamos estos indicadores para una adopción incremental.

Ahhh. Sí, estricto_opcional es Falso para pip._internal.index y este es exactamente ese error.

Y aunque models/link.py donde se define la función tiene strict_optional habilitado.

Bien, publiqué PR # 6774 para esto.

Este problema me dice que un buen paso después de esto (para 19.3 - no el lanzamiento del parche) será activar strict_optional para index.py ..

Y a pesar de que models / link.py, donde se define la función, tiene estricto_opcional habilitado.

Sí, mypy realiza comprobaciones en el sitio de la llamada, utilizando las reglas del sitio de la llamada.


Tu solución sugerida y relaciones públicas me parecen bien. Si no vemos que surja ningún otro problema, puedo hacer el lanzamiento de la corrección de errores en la noche de hoy, ~ 3-5 horas a partir de ahora.

Si no vemos que surja ningún otro problema, puedo hacer el lanzamiento de la corrección de errores en la noche de hoy, ~ 3-5 horas a partir de ahora.

Eso seria genial. Muchas gracias por hacer eso.

Hola. FWIW: Es posible que haya encontrado un error en 19.2 que no está relacionado con este. Todavía estoy tratando de resolverlo y luego abriré un nuevo problema.

EDITAR:
Ah, alguien ya abrió uno https://github.com/pypa/pip/issues/6775

La solución está en master. Haré el lanzamiento en un momento, descansando un poco después de un largo día de hoy.

Se ha subido la versión con esta corrección de errores. ¡Gracias a todos (y especialmente a @cjerdonek)! :)

¿Fue útil esta página
0 / 5 - 0 calificaciones