Pip: AttributeError: o objeto 'NoneType' não tem atributo 'is_hash_allowed'

Criado em 23 jul. 2019  ·  18Comentários  ·  Fonte: pypa/pip

Meio Ambiente

  • versão pip: 19.2
  • Versão Python: 3.6.8
  • SO: Mac OSX (Darwin Kernel versão 18.6.0)

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

  1. Obtenha a versão mais recente do pacote do PyPI.
  2. Em seguida, execute pip list --outdated --format=columns
  3. Ocorreu um erro.

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

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.

Todos 18 comentários

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

Esta página foi útil?
0 / 5 - 0 avaliações