Resumo : neste tutorial, você aprenderá como definir funções privadas do Python em um módulo usando a __all__
variável.
Suponha que você tenha um módulo chamado mail.py
com duas funções send()
e attach_file()
.
def send(email, message):
print(f'Sending "{message}" to {email}')
def attach_file(filename):
print(f'Attach {filename} to the message')
Linguagem de código: Python ( python )
E você deseja expor apenas a send()
função a outros módulos, não à attach_file()
função. Em outras palavras, você deseja que a attach_file()
função seja privada e não possa ser acessada de fora do módulo de correio.
Observe que, para simplificar, imprimimos apenas alguns textos nas funções.
Se outros módulos usarem a import *
instrução assim:
from mail import *
Linguagem de código: Python ( python )
você pode prefixar o nome de uma função com um sublinhado ( _
) para torná-la privada. Por exemplo:
def send(email, message):
print(f'Sending "{message}" to {email}')
def _attach_file(filename):
print(f'Attach {filename} to the message')
Linguagem de código: Python ( python )
No mail.py
arquivo, você pode usar o import * from mail
módulo e ver apenas a send()
função:
from mail import *
send('[email protected]','Hello')
Linguagem de código: Python ( python )
Em outras palavras, você não conseguirá acessar a _attach_file()
função do main
módulo. Se você tentar chamar a _attach_file()
função, receberá um erro.
Outra maneira de tornar a attach_file()
função privada é usar a __all__
variável. Dessa forma, você não precisa prefixar o nome da função com um sublinhado (_) para torná-la privada.
Especifica __all__
uma lista de funções (também variáveis e outros objetos) que estão disponíveis para os outros módulos. Em outras palavras, você pode tornar uma função privada não listando-a na __all__
variável.
O seguinte usa a __all__
variável no mail
módulo para tornar a send()
função pública e attach_file()
a função privada:
# mail.py
__all__ = ['send']
def send(email, message):
print(f'Sending "{message}" to {email}')
def attach_file(filename):
print(f'Attach {filename} to the message')
Linguagem de código: Python ( python )
No main.py
módulo, você também não pode acessar a attach_file()
função como antes:
# main.py
from mail import *
send('[email protected]','Hello')
Linguagem de código: Python ( python )
Conforme mencionado no tutorial do módulo , isso import *
não é uma boa prática e geralmente leva a bugs. No entanto, você ainda pode utilizá-lo usando um pacote .
Primeiro, crie um pacote chamado mail
com o __init__.py
arquivo e crie o email.py
módulo no mail
pacote:
├── mail
| ├── email.py
| └── __init__.py
└── main.py
Linguagem de código: Python ( python )
Segundo, coloque o seguinte código no email.py
arquivo:
# email.py
__all__ = ['send']
def send(email, message):
print(f'Sending "{message}" to {email}')
def attach_file(filename):
print(f'Attach {filename} to the message')
Linguagem de código: Python ( python )
Terceiro, use import *
e adicione a send()
função à __all__
variável em __init__.py
:
from .email import *
__all__ = email.__all__
Linguagem de código: Python ( python )
Ao fazer isso, o mail
pacote expõe apenas a send()
função especificada na email.__all__
variável. Ele esconde o que attach_file()
está do lado de fora.
Do main.py
arquivo, você pode importar o mail
pacote e usar a send()
função assim:
# main.py
import mail
mail.send('[email protected]','Hello')
Linguagem de código: Python ( python )
Alternativamente, você pode importar a send()
função do pacote mail:
# main.py
from mail import send
send('[email protected]','Hello')
Linguagem de código: Python ( python )
Resumo
Para tornar uma função privada em Python:
- Primeiro, crie um pacote com o
__init__.py
arquivo - Segundo, não especifique a função na
__all__
variável. - Terceiro, importe todos os símbolos do módulo no
__init__.py
arquivo do pacote e exponha apenas as funções públicas usando a__all__
variável.