Medio ambiente
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
pip list --outdated --format=columns
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'
@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)! :)
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.