logo

Namespace em Python

Neste tutorial, aprenderemos sobre o namespace em Python, a estrutura usada para organizar os nomes simbólicos atribuídos a objetos em um programa Python, por que o namespace é importante e como podemos usá-los em nosso programa Python. Vamos fazer uma breve introdução a um namespace.

O que é espaço para nome?

Em Python, uma maneira de dar a cada objeto um nome exclusivo é por meio de um namespace. Variáveis ​​e métodos são exemplos de objetos em Python. Em outras palavras, é uma coleção de nomes simbólicos conhecidos e os detalhes sobre aquilo a que cada nome se refere. Um nome pode ser considerado uma chave em um dicionário e os objetos são os valores em um namespace. Deveríamos descobrir isso com um modelo genuíno - um namespace se assemelha a um sobrenome. Se houver vários nomes de 'Pedro' na classe, pode ser difícil localizar um nome de 'Pedro'; no entanto, quando solicitamos especificamente 'Peter Warner' ou 'Peter Cummins', em uma turma, pode não ser comum que vários alunos tenham o mesmo nome e sobrenome.

string.valorde java

O interpretador Python pode compreender melhor o método ou variável exata no código graças ao namespace. Como resultado, seu nome contém informações adicionais, incluindo Espaço (relacionado ao escopo) e Nome, que denota um identificador exclusivo.

Em Python, existem quatro tipos de namespaces fornecidos a seguir.

  • Construídas em
  • Global
  • Fechando
  • Local

Como vários desses namespaces têm vida útil, o interpretador Python cria namespaces conforme necessário e os exclui quando não são mais necessários.

Vamos entender os vários tipos de namespace em Python.

O namespace integrado

Como o próprio nome sugere, ele contém nomes predefinidos de todos os objetos integrados do Python já disponíveis em Python. Vamos listar esses nomes com o seguinte comando.

Abra o terminal Python e digite o seguinte comando.

Comando -

 dir(__builtins__) 

Saída:

 ['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'ModuleNotFoundError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 'RecursionError', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopAsyncIteration', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'WindowsError', 'ZeroDivisionError', '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__', 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'breakpoint', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip'] 

O namespace integrado é criado pelo interpretador Python quando ele é inicializado. Eles são encerrados quando o interpretador Python termina.

O espaço para nome global

O namespace global consiste em quaisquer nomes em Python em qualquer nível do programa principal. Ele é criado quando o corpo principal é executado e permanece existindo até o intérprete terminar.

15 de 100,00

O interpretador Python cria um namespace global para qualquer módulo que nosso Python carrega com a instrução import. Para obter mais informações, visite nosso Módulo Python.

Os namespaces locais e anexos

Os namespaces locais são usados ​​pela função; Quando a função é executada, o interpretador Python cria um novo namespace. Os namespaces locais continuam a existir após a conclusão da execução da função. A capacidade também pode incluir outra capacidade. Conforme mostrado abaixo, podemos definir uma função dentro de outra.

Exemplo -

 def f(): print('Initiate f()') def g(): print('Initiate g()') print('End g()') return g() print('Initiate f()') return f() 

No modelo acima, a capacidade g() é caracterizada dentro da coleção de f(). Chamamos a função g() dentro de f() e a função principal f(). Vejamos como funciona a função acima:

  • Python cria um novo namespace para f() quando o chamamos.
  • Da mesma forma, f() chama g(), g() obtém seu próprio namespace diferente.
  • O namespace local g() foi criado para o namespace envolvente, f().

Cada um desses namespaces é encerrado quando a função é encerrada.

Escopo do Objeto/Variável

O termo 'escopo' especifica qual região de codificação de um objeto Python específico pode ser acessada. Cada objeto e variável possui um escopo no programa a partir do qual podemos acessar essa variável. Por exemplo, uma variável de função só pode ser acessada dentro da função. Vamos examinar a seguinte ilustração:

Exemplo -

 def scope_func(): print('Inside scope_func') def scope_inner_func(): var = 20 print('Inside inner function, value of var:',var) scope_inner_func() print('Try printing var from outer function: ',var) scope_func() 

Saída:

 Inside scope_func Inside inner function, value of var: 20 Traceback (most recent call last): File 'd:/Python Project/listproblems.py', line 343, in scope_func() File 'd:/Python Project/listproblems.py', line 342, in scope_func print('Try printing var from outer function: ',var) NameError: name 'var' is not defined 

Dicionários de namespace Python

No tutorial anterior, falamos sobre como os namespaces são como dicionários, com chaves representando nomes de objetos e valores representando objetos reais. Como dicionários, Python usa namespaces globais e locais. O acesso aos dicionários de namespace globais e locais é possível pelos métodos globals() e locals() do Python.

O método global()

O método globals() retorna uma referência ao dicionário de namespace global atual. Podemos usá-lo para acessar os objetos no namespace global. Vejamos o exemplo abaixo.

Exemplo -

 >>> type(globals()) >>> globals() {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': } 

Como podemos ver, existem muitas entradas integradas em globais() método. Pode ser diferente de acordo com seu sistema operacional e versão do Python. Agora vamos definir a variável global e observar as diferenças.

tigre comparado ao leão
 >>> a = 20 >>> globals() {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': , 'a': 20} 

Após a atribuição de a = 20, uma nova variável global é atribuída ao dicionário de namespace global. Podemos acessar os valores como acessamos nos dicionários. Vejamos o exemplo abaixo.

 >>> a = 20 >>> globals() {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': , 'a': 20} >>> a 20 >>> globals()['a'] 20 

Podemos modificar o valor do dicionário usando a função globals().

 >>> globals()['a'] = 100 >>> a 100 

Agora o novo valor de a aparecerá nos dicionários globais.

A função locals()

Python também fornece o método locals() semelhante a globals(), mas em vez disso acessa objetos no namespace local. Vejamos o exemplo a seguir.

Exemplo -

 >>> def func(a, b): ... str1 = 'Hello' ... loc = locals() ... print(loc) ... >>> func(10, 20) {'a': 10, 'b': 20, 'str1': 'Hello'} 

Quando chamamos func(10, 20), locals() retorna o dicionário que representa o namespace local da função. No escopo da função, definimos a variável local str1; o namespace local incluía os argumentos da função, uma vez que eles são locais para func().

Não obstante, quando chamamos a capacidade local people(), ela atua de forma equivalente à capacidade globals(). A função globals() e a função locals() diferem ligeiramente. A função globals() não apenas define variáveis ​​adicionais, mas também armazena o valor de retorno. O dicionário conterá as novas variáveis ​​e seus valores. Dê uma olhada no exemplo abaixo.

Exemplo -

 >>> glob_var = globals() >>> glob_var {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': , 'a': 100, 'func': , 'glob_var': {...}, 'x': 100, 'y': 'JavaTpoint'} >>> x = 100 >>> glob_var {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': , 'a': 100, 'func': , 'glob_var': {...}, 'x': 100, 'y': 'JavaTpoint'} 

Aqui o glob_var é uma referência ao dicionário de namespace global. As novas declarações de atribuição x e e apareceu no glob_var dicionário.

Alterando Variáveis ​​Fora do Escopo

No ambiente de chamada, a função pode alterar o argumento passando um valor diferente, mas às vezes não pode alterar o valor.

bloquear um aplicativo Android

Um argumento imutável não pode ser modificado por uma função.

Um argumento mutável pode ser alterado, mas não pode ser completamente redefinido.

Vamos entender o seguinte cenário.

Exemplo -

 x = 20 def func(): x = 40 print(x) func() print(x) 

Saída:

 40 20 

Definimos uma variável global x = 20 e também em função com o mesmo nome. Quando func() é executado, ele cria a nova referência de variável local para um objeto inteiro cujo valor é 40. Dentro do função() body, a instrução de atribuição não afetará o objeto global.

No entanto, uma função pode modificar um objeto de tipo mutável fora de seu escopo local. Vamos entender o exemplo abaixo.

dividindo uma string em c++

Exemplo -

 my_list = ['Hello', 'From', 'JavaTpoint'] def func(): my_list[1] = 'Welcome to' return my_list print(func()) 

O my_list é uma lista e é do tipo mutável. O func() pode ser modificado dentro de my_list mesmo que esteja fora do escopo local. Mas, se tentarmos reatribuir minha_lista, ele criará o novo objeto local e não modificará a minha_lista global. Vejamos o exemplo abaixo.

Exemplo -

 my_list = ['Hello', 'from', 'JavaTpoint'] def func(): my_list = ['A', 'B', 'C', 'D', 'E', ''] return my_list print(func()) 

Saída:

 ['A', 'B', 'C', 'D', 'E'] 

Conclusão

Cuidamos do namespace, como podemos utilizá-lo e do grau da variável. Vários objetos distintos podem ser criados com um breve programa Python. Este número pode exceder mil em um programa Python complicado. O namespace Python torna mais fácil para o intérprete lembrar os nomes desses objetos.