Normalmente, vejo esse padrão pelo menos uma vez em cada projeto Python em que trabalho. Por exemplo, em um projeto Django, isso geralmente é adicionado na parte inferior do arquivo de configurações básicas:
try:
from .local_settings import *
except ImportError:
pass
Além disso:
try:
import simplejson as json
except ImportError:
import json
Isso sempre me incomodou um pouco; e se o módulo for importado com sucesso, mas ele disparar um ImportError
? Por exemplo, no primeiro exemplo, o local_settings
módulo existe, mas local_settings
tenta importar um módulo inexistente.
Essa é a maneira mais segura de importar um módulo opcional, existe uma maneira melhor de obter essa funcionalidade ou depende do contexto / uso (e se sim, quais são as diretrizes para decidir quando usar essa abordagem)?
ImportWarning
sugere a documentação .Isso geralmente é seguro, supondo que seus módulos estejam livres de efeitos colaterais no momento da importação.
Se um módulo importado gera alguma exceção (não apenas
ImportError
) no momento da importação, ele é removido desys.modules
. Isso significa que, se qualquer outro código tentar importar o módulo, ele não receberá um módulo parcialmente inicializado. Em vez disso, o Python tentará carregar o módulo novamente e, presumivelmente, falhará comImportError
o novamente.Isso pode causar problemas se seus módulos tiverem efeitos colaterais no tempo de importação, pois esses efeitos não serão desfeitos. Em particular, se o módulo incorreto importar com êxito outro módulo, ele não será removido
sys.modules
. Esse efeito colateral específico raramente é um problema, mas alguns efeitos colaterais podem ser mais problemáticos.fonte