O que a PEP8 diz sobre os imports?

A PEP8 é um guia de estilo que contém várias recomendações para organizarmos o código escrito na linguagem python, facilitando a legibilidade e criando um padrão comum entre as soluções. Hoje vamos explorar as recomendações que dizem respeito a seção de imports que está presente em quase todos os nossos scripts.

imports sempre devem estar no começo do script

As instruções de import devem estar localizadas no ínicio do script, após comentários e/ou docstrings dos módulos e antes das variáveis globais e constantes, além de seguir a seguinte ordem: 1) imports da biblioteca padrão, 2) imports de bibliotecas de terceiros e 3) imports da aplicação que estamos desenvolvendo. Uma linha em branco deve separar cada um dos grupos mencionados.

O bloco a seguir não segue as recomendações da PEP8:

import pandas as pd
import numpy as np
import os
import math

O bloco a seguir segue as recomendações da PEP8:

# imports da biblioteca padrão
import math
import os

# imports de bibliotecas de terceiros
import numpy as np
import pandas as pd

# imports locais devem ser colocados neste bloco
import meumodulo

imports normalmente devem ser separados em linhas

Não é recomendado a utilização de uma instrução import para adicionar diferentes módulos ao script, eles devem ser preferencialmente importados em linhas separadas, como o exemplo a seguir.

# Forma incorreta
import os, sys

# Forma correta
import os
import sys

Porém, quando estamos lidando com submódulos de um módulos a seguinte forma é recomendada:

# Está forma está correta
from datetime import datetime, timedelta
from subprocess import Popen, PIPE

imports com caminho absolutos são recomendados

É recomendado o uso de caminhos absolutos quando estamos importando algum módulo da nossa própria solução, isso facilita a identificação da origem de determinado trecho de código.

import meumodulo.submodulo
from meumodulo import submodulo
from meumodulo.submodulo import classexemplo

imports relativos explícitos também são aceitos e imports relativos implícitos não são suportados, porém, sempre dê preferência para imports absolutos.

'''
Exemplo de import explícito.
Aqui estamos importando um módulo que está
dentro da mesma pasta que nosso script.
'''
from . import submodulo
from .submodulo import classexemplo

O que fazer em caso de conflito de classes de módulos e locais?

Em alguns casos podemos ter conflitos de nomes entre funções e/ou classes de algum módulo com nossas funções e/ou classes locais, quando isso acontecer as funções e/ou classes podem ser importadas da seguinte maneira:

# Exemplo utilizando o submódulo os.path
from os import path
# Chamada do submódulo: path.join('/home', 'leobiscassi')

'''
Caso exista algum conflito de nome com meu módulo
podemos realizar o import da seguinte maneira
'''
import os.path
# Chamada do submódulo: 
# os.path.join('/home', 'leobiscassi')

imports wildcard devem ser evitados

imports utilizando o wildcard * devem ser evitados, como no exemplo abaixo:

from os import *

Eu particularmente utilizo o wildcard quando possuo muitos submódulos e vou utilizar todos no meu script, porém, esse tipo de situação não costuma acontecer com frequência.

Conclusão

A PEP8 é um guia de boas práticas que nos ajuda a estruturar o código de maneira mais legível, isso inclui a seção de imports que na maioria das vezes está presente em nossos scripts python.

Nesta postagem conferimos algumas dicas presentes na PEP8 que nem sempre tomamos conhecimento, até pouco tempo atrás eu não sabia dessas recomendações, e vocês sabiam que existia uma recomendação específica de como organizar os imports no seu script? Deixa ai nos comentários! 🙂