Funções privadas do Python

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.pycom 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.pyarquivo, você pode usar o import * from mailmó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 mainmó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 mailmó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.pymó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 mailcom o __init__.pyarquivo e crie o email.pymódulo no mailpacote:

├── mail
|  ├── email.py
|  └── __init__.py
└── main.pyLinguagem de código:  Python  ( python )

Segundo, coloque o seguinte código no email.pyarquivo:

# 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 mailpacote 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.pyarquivo, você pode importar o mailpacote 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__.pyarquivo
  • Segundo, não especifique a função na __all__variável.
  • Terceiro, importe todos os símbolos do módulo no __init__.pyarquivo do pacote e exponha apenas as funções públicas usando a __all__variável.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *