sexta-feira, 4 de dezembro de 2020

Namespaces e escopo em Python

O que é namespace?

Um namespace é um sistema que tem um nome exclusivo para cada objeto em Python. Um objeto pode ser uma variável ou um método. O próprio Python mantém um namespace na forma de um dicionário Python. Vejamos um exemplo, uma estrutura de sistema de arquivos de diretório em computadores. Nem é preciso dizer que é possível ter vários diretórios com um arquivo com o mesmo nome dentro de cada diretório. Mas pode-se ser direcionado para o arquivo, se desejar, apenas especificando o caminho absoluto para o arquivo. Exemplo em tempo real, a função de um namespace é como um sobrenome. Pode-se não encontrar uma única “Alice” na classe, pode haver várias “Alice”, mas quando você pede particularmente “Alice Lee” ou “Alice Clark” (com um sobrenome), haverá apenas uma (desde que não ache que o nome e o sobrenome são os mesmos para vários alunos).

Em linhas semelhantes, o interpretador Python entende para qual método ou variável exata alguém está tentando apontar no código, dependendo do namespace. Portanto, a divisão da palavra em si fornece um pouco mais de informação. Seu Nome (que significa nome, um identificador único) + Espaço (que fala algo relacionado ao escopo). Aqui, um nome pode ser de qualquer método ou variável Python e o espaço depende do local de onde está tentando acessar uma variável ou um método.

Tipos de namespaces

Quando o interpretador Python é executado exclusivamente sem módulos, métodos, classes, etc. definidos pelo usuário. Algumas funções como print(), id() estão sempre presentes, elas são construídas em namespaces. Quando um usuário cria um módulo, um namespace global é criado, a criação posterior de funções locais cria o namespace local. O namespace integrado abrange o namespace global e o namespace global abrange o namespace local.

Vida útil de um namespace

O tempo de vida de um namespace depende do escopo dos objetos; se o escopo de um objeto terminar, o tempo de vida desse namespace chega ao fim. Portanto, não é possível acessar objetos de namespace interno a partir de um namespace externo.

Exemplo:

# var1 está no namespace global
var1 = 5
def alguma_função():
    # var2 está no namespace local
    var2 = 6
    def alguma_função_interna():
        # var3 está no namespace local aninhado 
        var3 = 7

Conforme mostrado na figura a seguir, o mesmo nome de objeto pode estar presente em vários namespaces, pois o isolamento entre o mesmo nome é mantido por seu namespace.

Mas em alguns casos, pode-se estar interessado em atualizar ou processar apenas a variável global, conforme mostrado no exemplo a seguir, deve-se marcá-la explicitamente como global e a atualização ou processo.

# Programa Python processando variável global
count = 5
def algum_método():
    global count
    count = count + 1
    print(count)

algum_método()

Resultado:

6

Escopo de objetos em Python

O escopo se refere à região de codificação a partir da qual um determinado objeto Python está acessível. Consequentemente, não se pode acessar qualquer objeto particular de qualquer lugar do código, o acesso deve ser permitido pelo escopo do objeto.

Vamos dar um exemplo para ter uma compreensão detalhada do mesmo:

Exemplo 1:

# Programa Python mostrando um escopo de objeto 
def alguma_função():
    print("Dentro de alguma_função")
    def alguma_função_interna():
        var = 10
        print("Função dentro de função, valor de var:", var)
    alguma_função_interna()
    print("Tente imprimir var da função externa: ", var)

alguma_função()

Resultado:

Dentro de alguma_função
Função dentro de função, valor de var: 10
Traceback (most recent call last):
  File "c:/Users/user/Desktop/geeksforgeeks/teste.py", line 22, in <module>
    alguma_função()
  File "c:/Users/user/Desktop/geeksforgeeks/teste.py", line 20, in alguma_função
    print("Tente imprimir var da função externa: ", var)
NameError: name 'var' is not defined

Artigo escrito por Shivam Dhanadhya e melhorado por wwwchetanranecr7
Traduzido por Acervo Lima de Namespaces and Scope in Python



0 comentários:

Postar um comentário