Python - globals

globals() Fonksiyonu

Tanım

1. Tanım:

globals() fonksiyonu, Python'da gömülü (built-in) bir fonksiyondur ve geçerli global sembol tablosunu temsil eden bir sözlük (dict) yapısı döndürür.

Sembol Tablosu: Bir programla ilgili tüm gerekli bilgileri içeren bir veri yapısıdır. Değişken adları, fonksiyonlar, sınıflar vb. bilgileri barındırır. Global sembol tablosu, programın global kapsamıyla ilgili tüm bilgileri depolar ve Python'da globals() fonksiyonu kullanılarak erişilir. Herhangi bir sınıf veya fonksiyonla ilişkilendirilmemiş değişkenler ve fonksiyonlar global kapsamda depolanır.

2. Tanım

globals() fonksiyonu, çalıştığımız dosyanın adı, yolu, dosya içerisinde tanımlanan global kapsamdaki tüm değişkenleri, fonksiyonları, sınıfları ve diğer sembolleri içeren bir sözlük döndürür. Çıktısı sözlük (dictionary) veri yapısındadır. Bu sözlük yapısının içindeki herhangi bir anahtar değerinin karşılığını print(globals()["degisken_adi"]) şekilde yazdırabiliriz .

3. Tanım

Bir başka tanımla, globals() fonksiyonu, Python'da mevcut global sembol tablosu sözlüğü döndüren yerleşik (dahili) bir fonksiyondur.

Sembol tablosu nedir derseniz; Sembol tablosu, program hakkında gerekli tüm bilgileri içeren bir veri yapısıdır. Bunlar değişken adlarını, fonksiyonları, sınıfları, ... vb. verileri içerir. Global sembol tablosu, programın global kapsamıyla ilgili tüm bilgileri depolar ve Python'da globals() fonksiyonu kullanılarak erişilir. Herhangi bir sınıf veya fonksiyonla ilişkili olmayan fonksiyonlar ve değişkenler global kapsamda saklanır. Bir sınıf veya fonksiyonla ilişkili olan fonksiyon ve değişkenlere ise locals() fonksiyonu ile erişilebilir.

Ek Tanımlar:

Global Alan

Bir Python programında, tüm fonksiyonların ve blokların dışında tanımlanan değişkenlerin ve nesnelerin bulunduğu alandır. Global alandaki değişkenlere, programın herhangi bir yerinden erişilebilir.

Yerel Alan

Bir Python fonksiyonu veya bloğu içinde tanımlanan değişkenlerin bulunduğu alandır. Yerel alandaki değişkenlere yalnızca tanımlandıkları fonksiyon veya blok içinden erişilebilir.

Sembol Tablosu

Bir programdaki tüm değişkenlerin, fonksiyonların ve sınıfların adlarını ve bilgilerini içeren bir veri yapısıdır.

Sözlük

Python'da anahtar-değer çiftleri şeklinde veri depolayan bir veri yapısıdır. Anahtarlar benzersiz olmalıdır ve değerlere anahtarları kullanılarak erişilir.

Metaprogramlama

Çalışma zamanında kendisini değiştirebilen veya üretebilen programlar yazma tekniğidir.

Sözdizimi:

globals() fonksiyonu herhangi bir parametre almaz. Sözdizimi basitçe şöyledir:

globals()

Kullanım Alanları:

Global Sembol Tablosunu İnceleme:

print(globals()) Bu kod, global sembol tablosunu içeren bir sözlük yazdırır.

kisiler.py dosyası oluşturup içerisine sadece aşağıdaki kodu yazalım ve kodu çalıştıralım.

print(globals())

ÇIKTI:

{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7559f6209d60>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/home/mhalil/python/kisiler.py', '__cached__': None}

Çıktı, bir sözlük veri tipi olarak karşımıza geldi.

Dosyanın içerisine a, b ve c isimli 3 adet değişken ekleyip bu değişkenlere sırayla 1, 2 ve 3 değerlerini atıyorum. kisiler.py dosyasının içeriği;

a, b, c = 1, 2, 3
print(globals())

Kodu çalıştıralım.

ÇIKTI:

{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x76e273105d00>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/home/mhalil/python/kisiler.py', '__cached__': None, 'a': 1, 'b': 2, 'c': 3}

Gördüğünüz gibi yukarıdaki ilk çıktıdan farklı olarak sözlük içerisine 'a': 1, 'b': 2, 'c': 3 key (anahtar) ve value (değer) bilgileri eklenmiş. a değişkenine şu şekilde erişebiliriz;

print(globals()["a"])

diyeceksiniz ki, a değişkenine direkt print(a) yazarak ta erişebilirdik, ne anladım bu işten :) Aşağıdaki kodu ve çıktısını inceleyelim:

a = 100

def deger():
    a = 50
    print("Lokal a değeri:", a)
    global_a = globals()["a"]
    print("Fonksiyon içerisinde global a değeri:", global_a)

deger()
print("Global a değeri:", a)

ÇIKTI:

Lokal a değeri: 50
Fonksiyon içerisinde global a değeri: 100
Global a değeri: 100

Gördüğünüz gibi aynı isme sahip (a) iki değişkeni sorunsuz bir şekilde kullabildik.

def degis():
      global a
      a = 10
degis()
print(a) 

Çıktı: 10

Bu örnekte, degis() fonksiyonu içinde global anahtar kelimesi kullanılarak a değişkeninin global olarak tanımlandığını görüyoruz. degis() fonksiyonu çağrıldığında, global a değişkeninin değeri 10 olarak güncellenir.

Dinamik Kod Üretme:

globals() fonksiyonu, dinamik olarak kod üretmek için de kullanılabilir. Örneğin, kullanıcıdan alınan bir girdiye göre yeni değişkenler oluşturmak veya fonksiyonları çağırmak için kullanılabilir.

degisken_adi = input("Değişken adı girin: ")
degisken_degeri = input("Değişken değeri girin: ")

globals()[degisken_adi] = degisken_degeri

print(degisken_adi, "=", globals()[degisken_adi])

Bu örnekte, kullanıcıdan bir değişken adı ve değeri alınır. Daha sonra, globals() fonksiyonu kullanılarak kullanıcı tarafından belirtilen isimde bir global değişken oluşturulur ve değeri atanır.

Farklı dosyalardaki (örneğin bir modüldeki) değişken ismini globals ile tekrar değişken ismi olarak kullanabilirsiniz.

Önemli Noktalar:

Global Değişkenleri Değiştirme Riski:

globals() fonksiyonu kullanılarak global değişkenleri değiştirmek, beklenmeyen yan etkilere neden olabilir ve kodun okunabilirliğini azaltabilir. Bu nedenle, global değişkenleri değiştirmek yerine fonksiyonlara parametre olarak iletmek ve dönüş değerlerini kullanmak daha iyi bir uygulamadır.

Yerel Kapsam:

globals() fonksiyonu yalnızca global kapsamdaki nesnelere erişim sağlar. Yerel kapsamda (örneğin bir fonksiyon içinde) globals() fonksiyonu çağrılırsa, yine global sembol tablosunu döndürür.

Sonuç:

Kaynaklar: