Python da Etkisizleştirme

Etkisizleştirme (r)

Dediğimiz gibi, Python’daki en temel kaçış dizisi  işaretidir. Bu işaret bazı başka harflerle birleşerek yeni kaçış dizileri de oluşturabilir.

Python’da  işaretinin dışında temel bir kaçış dizisi daha bulunur. Bu kaçış dizisi ‘r’ harfidir. Şimdi bu kaçış dizisinin nasıl kullanılacağını ve ne işe yaradığını inceleyelim:

Şöyle bir çıktı vermek istediğimizi düşünün:

Kurulum dizini: C:\aylar\nisan\toplam masraf

Bildiğimiz yoldan bu çıktıyı vermeye çalışırsak neler olacağını adınız gibi biliyorsunuz:

>>> print("Kurulum dizini: C:aylarnisantoplam masraf")

Kurulum dizini: C:ylar
isan        oplam masraf

Eğer Windows üzerinde çalışıyorsanız bu komutu verdikten sonra bir !bip! sesi de duymuş olabilirsiniz…

Python tabii ki, karakter dizisi içinde geçen ‘aylar’, ‘nisan’, ve ‘toplam masraf’ ifadelerinin ilk karakterlerini yanlış anladı! an ve t gibi ifadeler Python’ın gözünde birer kaçış dizisi. Dolayısıyla Python a karakterlerini görünce bir !bip! sesi çıkarıyor,n karakterlerini görünce satır başına geçiyor ve t karakterlerini görünce de Tab tuşuna basılmış gibi bir tepki veriyor. Sonuç olarak da yukarıdaki gibi bir çıktı üretiyor.

Daha önce bu durumu şöyle bir kod yazarak engellemiştik:

>>> print("Kurulum dizini: C:\aylar\nisan\toplam masraf")

Kurulum dizini: C:aylarnisantoplam masraf

Burada,  işaretlerinin her birini çiftleyerek sorunun üstesinden geldik. Yukarıdaki yöntem doğru ve kabul görmüş bir çözümdür. Ama bu sorunun üstesinden gelmenin çok daha basit ve pratik bir yolu var. Bakalım:

>>> print(r"Kurulum dizini: C:aylarnisantoplam masraf")

Kurulum dizini: C:aylarnisantoplam masraf

Gördüğünüz gibi, karakter dizisinin baş kısmının dış tarafına bir adet r harfi yerleştirerek sorunun üstesinden geliyoruz. Bu kaçış dizisinin, kullanım açısından öteki kaçış dizilerinden farklı olduğuna dikkat edin. Öteki kaçış dizileri karakter dizisinin içinde yer alırken, bu kaçış dizisi karakter dizisinin dışına yerleştiriliyor.

Bu kaçış dizisinin tam olarak nasıl işlediğini görmek için dilerseniz bir örnek daha verelim:

>>> print("Kaçış dizileri: , n, t, a, \, r")

Kaçış dizileri: ,
,   , , , r

Burada da Python bizim yapmak istediğimiz şeyi anlayamadı ve karakter dizisi içinde geçen kaçış dizilerini doğrudan ekrana yazdırmak yerine bu kaçış dizilerinin işlevlerini yerine getirmesine izin verdi. Tıpkı biraz önceki örnekte olduğu gibi, istersek kaçış dizilerini çiftleyerek bu sorunu aşabiliriz:

>>> print("Kaçış dizileri: \, \n, \t, \a, \, r")

Kaçış dizileri: , n, t, a, \, r

Ama tabii ki bunun çok daha kolay bir yöntemi olduğunu biliyorsunuz:

>>> print(r"Kaçış dizileri: , n, t, a, \, r")

Kaçış dizileri: , n, t, a, \, r

Gördüğünüz gibi, karakter dizisinin başına getirdiğimiz r kaçış dizisi, karakter dizisi içinde geçen kaçış dizilerinin işlevlerini yerine getirmesine engel olarak, istediğimiz çıktıyı elde etmemizi sağlıyor.

Bu arada bu kaçış dizisini, daha önce öğrendiğimiz r adlı kaçış dizisi ile karıştırmamaya dikkat ediyoruz.

Python’daki bütün kaçış dizilerinden söz ettiğimize göre, konuyu kapatmadan önce önemli bir ayrıntıdan söz edelim.

Python’da karakter dizilerinin sonunda sadece çift sayıda  işareti bulunabilir. Tek sayıda  işareti kullanıldığında karakter dizisini bitiren tırnak işareti etkisizleşeceği için çakışma sorunu ortaya çıkar. Bu etkisizleşmeyi, karakter dizisinin başına koyduğunuz ‘r’ kaçış dizisi de engelleyemez. Yani:

>>> print("Kaçış dizisi: ")

Bu şekilde bir tanımlama yaptığımızda Python bize bir hata mesajı gösterir. Çünkü kapanış tırnağının hemen öncesine yerleştirdiğimiz  kaçış dizisi, Python’ın karakter dizisini kapatan tırnak işaretini görmezden gelmesine yol açarak bu tırnağı etkisizleştiriyor. Böylece sanki karakter dizisini tanımlarken kapanış tırnağını hiç yazmamışız gibi bir sonuç ortaya çıkıyor:

>>> print("Kaçış dizisi: ")
  File "<stdin>", line 1
    print("Kaçış dizisi: ")
                              ^
SyntaxError: EOL while scanning string literal

Üstelik bu durumu, r adlı kaçış dizisi de engelleyemiyor:

>>> print(r"Kaçış dizisi: ")
  File "<stdin>", line 1
    print(r"Kaçış dizisi: ")
                               ^
SyntaxError: EOL while scanning string literal

Çözüm olarak birkaç farklı yöntemden yararlanabilirsiniz. Mesela karakter dizisini kapatmadan önce karakter dizisinin sonundaki  işaretinin sağına bir adet boşluk karakteri yerleştirmeyi deneyebilirsiniz:

>>> print("Kaçış dizisi:  ")

Veya kaçış dizisini çiftleyebilirsiniz:

>>> print("Kaçış dizisi: \")

Ya da karakter dizisi birleştirme yöntemlerinden herhangi birini kullanabilirsiniz:

>>> print("Kaçış dizisi: " + "\")
>>> print("Kaçış dizisi:", "\")
>>> print("Kaçış dizisi: " "\")

Böyle bir durumla ilk kez karşılaştığınızda bunun Python programlama dilinden kaynaklanan bir hata olduğunu düşünebilirsiniz, ancak bu durum Python’ın resmi internet sitesinde ‘Sıkça Sorulan Sorular’ bölümüne alınacak kadar önemli bir tasarım tercihidir: http://goo.gl/i3tkk

Alıntıdır.