Meio Ambiente
Descrição
Fiz atualização de env em meu projeto, incluindo pip também. Depois disso, queria verificar os pacotes desatualizados com o comando:
pip list --outdated --format=columns
Depois que essa exceção foi levantada.
Comportamento esperado
Eu esperava uma lista de pacotes ou lista vazia.
Como reproduzir
pip list --outdated --format=columns
Resultado
(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 Obrigado por registrar este problema!
/ cc @cjerdonek, já que ele trabalhou nesta parte do código-base e está mais familiarizado com ele do que eu.
Mesmo problema no Windows 10, Python 3.7.3
Mesmo problema no Ubuntu 18.04.2 LTS, Python 3.6.8
Mesmo problema no macOS 18.6.0 e Python 3.7.4
Mesmo problema no Windows 10, Python 3.7.4
Mesmo problema no Fedora 29, Python 3.7.3.
Por enquanto, como uma solução alternativa, ...
python3 -m pip install -UI --user 'pip<19.2'
reinstalado pip
versão 19.1.1. Embora a saída completa do comando seja 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 que ele informa Successfully installed pip-19.2
?
Obrigado pela confirmação de que isso ocorre em vários sistemas operacionais!
Pessoal, se você estiver enfrentando o mesmo problema, por favor, não poste comentários adicionais. Use as reações do GitHub para votar a favor da primeira postagem e se inscrever no problema.
Dessa forma, os mantenedores poderiam ter uma discussão sobre como resolver isso neste problema - comentários adicionais do tipo "eu também" não ajudarão ninguém.
Hmm, acho que o verificador de tipo nos falhou aqui. A anotação de tipo diz que hashes
não deve ser nenhum, mas é Nenhum nos casos relatados: https://github.com/pypa/pip/blob/369ec7c0a8a81a076ca5584c34c8530d7a30a220/src/pip/_internal/models/link .py # L202 -L209
Depois de uma olhada rápida, acho que uma boa solução por agora pode ser atualizar Link.is_hash_allowed(hashes)
para retornar False
se hashes
for Nenhum (e trazer a anotação para o alinhamento atualizando o parâmetro para Optional[Hashes]
). Isso é provavelmente mais simples e mais seguro neste ponto do que tentar atualizar as coisas em possivelmente vários lugares para garantir que o argumento hashes
seja sempre diferente de None
, especialmente porque parece que não podemos apoie-se no verificador de tipo para confirmar com 100% de certeza.
Acho que o verificador de tipo nos falhou aqui.
Ahhh. Sim - strict_optional é False para pip._internal.index
e esta é exatamente a falha.
parece que não podemos nos apoiar no verificador de tipo para confirmar com 100% de certeza.
Sim, não podemos confiar totalmente nisso, contanto que tenhamos esses sinalizadores para adoção incremental.
Ahhh. Sim - strict_optional é False para pip._internal.index e esta é exatamente a falha.
E embora models/link.py
onde a função é definida tem strict_optional
habilitado.
Ok, postei PR # 6774 para isso.
Este problema me diz que um bom passo depois disso (para 19.3 - não o lançamento do patch) será ativar strict_optional
para index.py
..
E mesmo que models / link.py onde a função é definida tenha strict_optional ativado.
Sim - mypy faz verificações no site da chamada, usando as regras do site da chamada.
Sua correção sugerida e RP parecem boas para mim. Se não virmos nenhum outro problema, posso lançar a correção de bugs à noite hoje - cerca de 3-5 horas a partir de agora.
Se não virmos nenhum outro problema, posso lançar a correção de bugs à noite hoje - cerca de 3-5 horas a partir de agora.
Isso seria bom. Muito obrigado por fazer isso.
Olá. FWIW posso ter encontrado um bug em 19.2 que não está relacionado a este. Ainda estou tentando descobrir e abrirei um novo problema depois.
EDITAR:
Ah, alguém já abriu um https://github.com/pypa/pip/issues/6775
A correção está no mestre. Farei o lançamento daqui a pouco - descansarei um pouco depois de um longo dia de hoje.
A versão com esta correção de bug foi enviada. Obrigado a todos (e especialmente @cjerdonek)! :)
Comentários muito úteis
A correção está no mestre. Farei o lançamento daqui a pouco - descansarei um pouco depois de um longo dia de hoje.