Uma das primeiras coisas que aprendemos em Python é como criar uma variável e atribuir a ela um valor usando o operador de atribuição =.
x = 5
y = 3.14159
z = 'maçã'
Nesse caso, estamos criando uma variável x e atribuindo o valor 5, criando uma variável y e atribuindo o valor 3.14159, e criando uma variável z e atribuindo o valor ‘maçã’.
Mas você sabia que podemos fazer isso sem usar 1) o operador de atribuição = ou 2) criar a própria variável? Vamos explorar como fazer isso.
Aqui está Como
globals().__setitem__('x', 5)
globals().__setitem__('y', 3.14159)
globals().__setitem__('z', 'maçã')
print(x) # 5
print(y) # 3.14159
print(z) # maçã
O que? Isso mesmo!
Entendendo o globals()
Primeiro, vamos começar com o globals().
x = 5
print(globals())
# {'__name__': '__main__', ..., 'x': 5}
x = 5
y = 6
print(globals())
# {'__name__': '__main__', ..., 'x': 5, 'y': 6}
globals() retorna um dicionário que contém todas as variáveis globais – seus nomes de variáveis como chaves e valores como valores. Ele também contém coisas padrão como __name__ e outros.
E mais importante, ele contém as variáveis que criamos!
Usando globals()
Agora, o que fazemos com globals()[‘x’] = 5 é o mesmo que fazer x = 5.
E o que é esse negócio de __setitem__?
Bem, d[‘x’] = 5 é o mesmo que d.__setitem__(‘x’, 5).
Portanto, x = 5 é o mesmo que globals().__setitem__(‘x’, 5).
E é assim que podemos criar uma variável em Python sem realmente criar uma variável!
globals().__setitem__('x', 5) # x = 5
globals().__setitem__('y', 3.14159) # y = 3.14159
globals().__setitem__('z', 'maçã') # z = maçã
print(x) # 5
print(y) # 3.14159
print(z) # maçã