Ana içeriğe geç

if __name__ == "__main__" Python: Kapsamlı Açıklama

Python'da if __name__ == "__main__" bloğu, dosyanın bir betik olarak doğrudan çalıştırıldığında çalışacak, ancak başka bir betiğe modül olarak içe aktarıldığında çalışmayacak kod tanımlamanıza olanak tanır.
· 8 dk. oku

Yapay Zeka ile Keşfedin

if __name__ == "__main__" ile başlayan koşullu blok Python kodlarında sıkça karşınıza çıkar. Bu satır gizemli görünebilir ve birçok yeni başlayan, ne yaptığını veya kullanmaları gerekip gerekmediğini bilmeden onu kullanır. Diğer dillerden gelen programcılar da bu deyimi yanlış anlayabilir ve aşırı kullanabilir.

Bu eğitimde Python'ın if__name__ == "__main__" deyiminin anlamına derinlemesine bakacak ve nasıl ile ne zaman kullanılacağını inceleyeceğiz.

__name__ ve "__main__" Anlamak

if __name__ == "__main__" deyimi, eşitliği kontrol eden bir if ifadesidir.

Eşitlik operatörünün == solundaki ilk işlenen, öznitelik __name__'dir. Başında ve sonunda çift alt çizgi bulunan Python adları özel tanımlayıcılardır. Her modülün bir __name__ özniteliği vardır. Python bu değişkeni modül adına ayarlar; Python'un içe aktarma sistemi her modülü benzersiz olarak tanımlamak için bunu kullanır.

Ancak modül, program için giriş noktası olarak kullanılan üst düzey kod ortamında (top-level code environment) ise Python, __name__ özniteliğini "__main__" dizesine ayarlar.

Birkaç örneğe bakalım. exploring_name_main.py adlı bir betik oluşturalım:

# exploring_name_main.py
import random
print(__name__)
print(random.__name__)

Bu betik terminalde aşağıdaki komutla doğrudan çalıştırılabilir:

$ python exploring_name_main.py
__main__
random

exploring_name_main.py betiği, programın giriş noktası olduğu için üst düzey kod ortamındadır. Bu nedenle __name__ değişkeni "__main__" dizesine ayarlanır.

Buna karşılık, random modülü içe aktarılmıştır ve üst düzey kod ortamında değildir. Onun __name__ özniteliği modülün adına ayarlanır.

Şimdi de ilk betiği içe aktaran more_exploration.py adlı yeni bir betik oluşturalım:

# more_exploration.py
import exploring_name_main

Bu betiği terminalde aşağıdaki komutla çalıştırın:

$ python more_exploration.py
exploring_name_main
random

Bir modül içe aktarıldığında, modülün kodu yürütülür. Bu nedenle more_exploration.py çalıştırıldığında, exploring_name_main.py içindeki iki print() çağrısının çıktısı görüntülenir. exploring_name_main.py artık programın giriş noktası olmadığından, __name__ özniteliği "__main__" yerine betiğin adına ayarlanır.

if __name__ == "__main__" Koşul Bloğu

__name__ değişkeni, bir modülün bir programın ana giriş noktası olup olmadığını belirlemek için kullanılabilir. Bu nedenle bir modül, yalnızca doğrudan bir betik olarak çalıştırıldığında yürütülecek, içe aktarıldığında ise çalışmayacak kod içerebilir. Yalnızca betik doğrudan çalıştırıldığında çalışması gereken kod, if __name__ == "__main__" koşul bloğuna eklenir:

# exploring_name_main.py
import random
print(__name__)
print(random.__name__)
number = random.randint(1, 10)
if __name__ == "__main__":
    print("This script is in the top-level code environment")
    print(f"The number is {number}")

exploring_name_main.py içindeki kod artık bir if __name__ == "__main__" koşul bloğu içeriyor. Betiği çalıştırdığımızda bunun bir fark yaratıp yaratmadığına bakalım:

$ python exploring_name_main.py
__main__
random
This script is in the top-level code environment
The number is 10

Betiği doğrudan çalıştırdığınızda, __name__ değişkeni "__main__" dizesine ayarlanır. Bu nedenle if ifadesindeki koşul True olarak değerlendirilir ve Python if bloğundaki kodu yürütür.

Ancak modül içe aktarıldığında, __name__ modülün adına ayarlanır ve program if bloğunu çalıştırmaz. more_exploration.py betiğinin exploring_name_main modülünü içe aktardığını unutmayın:

$  python more_exploration.py
exploring_name_main
random

Program, exploring_name_main.py içindeki print() fonksiyonlarını çağırmaz. Bunlar, __name__ "__main__"'e eşit olmadığı için yürütülmeyen koşul bloğundadır.

Python'da if __name__ == "__main__" Kullanırken En İyi Uygulamalar ve İpuçları

Python'ın if __name__ == "__main__" deyimi, kodun bir dosya betik olarak çalıştırıldığında yürütülmesi, ancak modül olarak içe aktarıldığında yürütülmemesi gerektiği durumlarda kullanılır. Betik ve modül terimleri arasındaki fark yalnızca dosyanın nasıl kullanıldığına ilişkindir. Her iki terim de .py uzantılı dosyalara atıfta bulunur.

Yaygın bir kullanım durumu, bir betikteki değişkenlerin, fonksiyonların ve sınıfların diğer programlarda da kullanılabilmesidir. İşte shapes.py adlı bir betik üzerinden bir örnek:

# shapes.py
import math
def find_area_of_circle(radius):
    return math.pi * radius ** 2
def find_area_of_rectangle(width, height):
    return width * height
if __name__ == "__main__":
    shape = int(input("Enter 1 for circle, 2 for rectangle: "))
    if shape == 1:
        radius = int(input("Enter radius: "))
        print(f"The area of the circle is {find_area_of_circle(radius)}")
    elif shape == 2:
        width = int(input("Enter width: "))
        height = int(input("Enter height: "))
        print(f"The area of the rectangle is {find_area_of_rectangle(width, height)}")
Enter 1 for circle, 2 for rectangle: 2
Enter width: 10
Enter height: 20
The area of the rectangle is 200

Bu kodun her zaman bir betik olarak çalıştırılması amaçlanıyorsa if __name__ == "__main__" deyimine ihtiyaç yoktur. Ancak bu koşullu ifadenin eklenmesi, if bloğundaki satırlar yürütülmeden kodun bir modül olarak içe aktarılmasına olanak tanır. more_shapes.py adlı başka bir betiği düşünün:

# more_shapes.py
import shapes
radius = 5
print(f"The area of the circle defined in 'more_shapes.py' is: "
      f"{shapes.find_area_of_circle(radius)}")
The area of the circle defined in 'more_shapes.py' is: 78.53981633974483

Bu yeni betik, more_shapes.py, içe aktarma ifadesi sayesinde shapes.py içinde tanımlanan fonksiyonlara erişir. Ancak shapes.py içindeki if __name__ == "__main__" bloğundaki kod yürütülmez. shapes.py'deki if ifadesi olmadan, modül içe aktarıldığında tüm kod yürütülürdü.

if __name__ == "__main__" bloğunu kullanıcı girdisi için kullanmak yaygın bir örnektir. Dosya bir modül olarak içe aktarılırsa kullanıcı girdisi atlanır; üst düzey kod olarak doğrudan çalıştırıldığında ise dahil edilir.

main() fonksiyonu kullanmak

if __name__ == "__main__" bloğuna mümkün olduğunca az ifade dahil etmek en iyi uygulamadır; bu, kodun daha okunaklı olmasını sağlar. Bunu başarmanın yaygın bir yolu, koşullu blok içinde çağrılan bir fonksiyon oluşturmaktır. Bu fonksiyonun adı genellikle main() olur, ancak herhangi bir fonksiyon adı da geçerlidir:

# shapes.py
import math
def find_area_of_circle(radius):
    return math.pi * radius ** 2
def find_area_of_rectangle(width, height):
    return width * height
def main():
    shape = int(input("Enter 1 for circle, 2 for rectangle: "))
    if shape == 1:
        radius = int(input("Enter radius: "))
        print(f"The area of the circle is {find_area_of_circle(radius)}")
    elif shape == 2:
        width = int(input("Enter width: "))
        height = int(input("Enter height: "))
        print(f"The area of the rectangle is {find_area_of_rectangle(width, height)}")
       
if __name__ == "__main__":
    main()

main() fonksiyonundaki kod, önceki sürümde doğrudan if __name__ == "__main__" bloğuna dahil edilen kodla aynıdır.

Python'da, bazı diğer programlama dillerinden farklı olarak, programın ana giriş noktası olarak main() fonksiyonu zorunlu değildir. Bu nedenle main() ve if __name__ == "__main__" deyiminin kullanımı isteğe bağlıdır ve yalnızca kod hem bağımsız bir betik hem de bir modül olarak kullanılmak istendiğinde gereklidir.

Python'ın if __name__ == "__main__" deyiminin bir diğer yaygın kullanım alanı da betiğe testler eklemektir. Testler, betik doğrudan çalıştırıldığında yürütülür; başka bir modülden içe aktarıldığında ise çalıştırılmaz. Ancak bu yaklaşım basit durumlar için uygun olsa da, en iyisi testleri test etmeye adanmış ayrı bir modülde toplamaktır.

Sonuç

Python'ın if __name__ == "__main__" deyimi, bir betik doğrudan çalıştırıldığında yürütülen, ancak içe aktarıldığında yürütülmeyen kodu eklemek için kullanışlıdır. Python yorumlayıcısı, bir modül içe aktarıldığında __name__ değişkenini modülün adına, modül programın ana giriş noktası olduğunda ise "__main__" dizesine ayarlar.

Bazı diğer programlama dillerinden farklı olarak, main() fonksiyonu ve if __name__ == "__main__" deyimi Python kodunu çalıştırmak için bir gereklilik değildir; ihtiyaç duyulduğunda programcının kullanabileceği bir araçtır.

Stephen Gruppetta

Yazar

Stephen Gruppetta

Malta Üniversitesi’nde lisans düzeyinde Fizik ve Matematik okudum. Ardından Londra’ya taşındım ve Imperial College’da Fizik alanında doktoramı tamamladım. İnsan retinasını görüntülemek için yeni optik teknikler üzerine çalıştım. Şimdi Python hakkında yazmaya, Python’u anlatmaya ve Python öğretmeye odaklanıyorum.

Konular

İlgili