Python bloklarındaki kolon teknik olarak gerekli mi?


19

Bu gerçekten daha fazlasını anlamak isteyen bir python acemi tarafından teorik bir sorudur.

Python'daki blok ilk ifadelerinden sonra iki nokta üst üste unutmaya devam ediyorum. Demek istediğim bunlar:

  • for <variable> in <sequence>:
  • if <blah blah>:

Benim düşüncem unutmaya devam etmemin bir nedeni, fiili olarak örtük olmalarıdır: iki nokta üst üste ya da değil, ifade bu satırla biter.

Python sözdiziminin nasıl çalıştığını öğrenmek için sorduğum sorum, iki nokta üst üste gerçekten gereksiz mi? İki nokta üst üste artık gerekli olmayacak şekilde python sözdizimini değiştirecek miydim, bir şey kırılır mı? Bu bazı ifadeleri belirsiz veya imkansız hale getirir mi?


4
Soruyu anlamadığınızı düşünüyorum, sözdiziminin çalışması için iki nokta üst üste işaretlerin gerekli olup olmadığıdır. Ayrıca, cevabınız ne olursa olsun, bir açıklama da içermelidir.
Tomáš Zato - Monica'yı

Muhtemelen, bu konuyla ilgili görüşünüzden yararlanabilmem için sorunun bazı bölümlerini yeniden ifade edebilir misiniz, belki bir örnek? En iyi yargıç olursun, bence sormak istediğin şeyden habersizim. Bunu çevirmen / derleyici ayrıştırıcısı seviyesinde mi kastediyorsunuz? Çok teşekkürler.
bhan sur

Daha iyi nasıl ifade edeceğimi bilmiyorum. Eğer artık sonra iki nokta üst üste ihtiyacı olduğunu bu nedenle tüm piton sözdizimi değişebilir Eğer sorum temelde olduğunu if, else, whilevb. Eğer bunu yaparsanız, python hala belirsizlik olmadan kullanılabilecek bir dil midir?
Tomáš Zato - Monica'yı

Anladım! Bu, python'un sözdizimi tasarım kararları hakkında bir soru . Üzgünüm, yanlış anladın. Açıkladığınız için teşekkürler.
bhan sur

Spekülasyon. Sanki satır sonlarının pratikte tercümanlar / ayrıştırıcılar tarafından algılanması daha zor ya da okunabilirlik için oradalar. LUA'da if .. then .. endtek bir satıra yazabilirsiniz . Yani burada python'da theniki şey a :ve gerekli bir yeni satır ile değiştirilir. Bunlardan biri gereksiz görünüyor.
bhan sur

Yanıtlar:


9

Evet, kolon belirli yapıları netleştirmek için gereklidir. Örneğin, düşünün if x - y < z: pass. İki nokta üst üste işareti olmadan, x, y ve z'nin bağlamını bilmeden bunun nasıl ayrıştırılacağına karar veremeyiz. if x: -y < z...x boolean if x - y < z:ise geçerlidir, aksi takdirde geçerlidir.

Bir programlama dilinin, ayrıştırmak için derlediğiniz noktaya kadar bir uygulama yürütmenizi gerektirmemesi çok iyi bir fikir olduğundan, iki nokta üst üste çok gereklidir. Onu bırakabilirsiniz, ancak anlamsızlaştırmak için başka yollara ihtiyacınız olacak.


1
Bekle, aynı çizgide iki nokta üst üste ifadesi olabilir mi? İzin verilmediđinden oldukça emindim.
Tomáš Zato - Monica'yı

1
İzin verilir, ancak ondan sonra bir satır kesmesi ile.
Phoshi

Hala biraz kafam karıştı. Buna izin verilir: if condition: print("Condition passed")\nizin veriliyor mu? \nBaskı deyiminden sonra yeni bir satır sembolize eder.
Tomáš Zato - Monica'yı

Tabii, sadece dene.
RemcoGerlich

1
@TomasZato: evet iki nokta üst üste işaretinden sonra herhangi bir deyim olabilir. Bloğu hemen sonlandırır, bu nedenle blok küçük bir astar olduğunda özellikle yararlıdır.
Yalan Ryan

14

Kolon dilbilgisi açısından gerçekten gerekli değildir, Python farklı bir dünyada tasarlanmış olsaydı, dil tasarımcısının iki nokta üst üste işaret etmeye karar vermeyebileceği düşünülebilir. Gerçekten de Cobra gibi diller bunu yapıyor.

Python'da kolonun gerekli olmasının temel nedeni insan tarafından okunabilirliğidir. Python SSS'den alıntı yapmak için :

İf / while / def / class ifadeleri için neden iki nokta üst üste gerekir?

İki nokta üst üste okunabilirliği arttırmak için gereklidir (deneysel ABC dilinin sonuçlarından biri). Bunu düşün:

if a == b
    print(a)

e karşı

if a == b:
    print(a)

İkincisinin okunmasının biraz daha kolay olduğuna dikkat edin. Bir kolonun bu SSS cevabındaki örneği nasıl ortaya koyduğuna dikkat edin; İngilizce standart bir kullanımdır.

Bir başka küçük neden de, kolonun sözdizimi vurgulaması olan editörleri kolaylaştırmasıdır; program metninin daha ayrıntılı bir şekilde ayrıştırılması yerine girintinin ne zaman artırılması gerektiğine karar vermek için iki nokta üst üste işareti arayabilirler.

SSS'de de belirtildiği gibi, iki nokta üst üste dili tamamen ayrıştırmadan python kodunu işlemeyi kolaylaştırır. Python derleyicisi de dahil olmak üzere tam teşekküllü ayrıştırıcıya sahip herhangi bir metin işlemcisi, iki nokta üst üste gerekmeden veya açık olduğunda isteğe bağlı yapılmışsa yapabilir.


4
“İkincisinin okumasının biraz daha kolay olduğuna dikkat edin.” İlk okumayı daha kolay buluyorum. Daha az gürültü.
user76284

10

Bilgisayar için değil, insanlar için gerekli.

Guido van Rossum'un (Python'un yaratıcısı) bir süre Python tarih blogu vardı. Kolon, Python'un birçok özelliğinin kaynağı olan ABC'de tanıtıldı .

In "Karin Dewar, Indentasyonu ile Colon" bu blog yayınında Guido yazıyor:

Ve burada Lambert'in isteği üzerine yorum yapacağım.

1978 yılında, Jabłonna (Polonya), Robert Dewar, Peter King, Jack Schwartz ve Lambert'teki bir konaktaki bir tasarım oturumunda, her alternatifte yazılı (buggy) kabarcık sıralama uygulamalarını karşılaştırarak B için çeşitli alternatif önerilen sözdizimlerini karşılaştırıyorlardı. Anlaşamadıkları için Robert Dewar'ın karısı odasından çağrıldı ve modern bir Paris'in Hera, Athena ve Afrodit'in güzelliğini karşılaştırmasını istediği gibi fikrini istedi. Ama ilk versiyon ona açıklandıktan sonra, şöyle diyordu: "Yani, 'FOR i ...' yazan satırda, sadece bu satır için değil, takip eden satırlar için de yapılması gerektiğini mi söylüyorsunuz? !" Ve burada bilim adamları, bu hattın sonunda bir kolon olsaydı yanlış anlaşılmanın önleneceğini fark ettiler.

( B burada ABC'ye yol açan bir dizi B0, B1, ... prototip dili. C'nin selefi olan B dili değil).

Ayrıca Guido'nun 90'larda, iki nokta üst üste ile biten bir çizgiden sonra otomatik olarak bir girinti ekleyebilecek olan editörlerin yararına olduğunu belirtti. Ama bunun için henüz bir kaynak bulamadım.


4

Cobra Programlama Dili 'ın sözdizimi ağır Python en esinlenerek ve buna kesinlikle gerekli olmadığını görünüyor bu yüzden, uzak nokta üst üste ile yaptığı edilir. Ancak, yeterli değildir , sadece iki nokta üst üste kaldırmak gerekli sözdizimi başka değişiklikler vardır. Örneğin, oyuncak projelerimden birindeki bu kod parçasına bakın :

kons  = lambda hd, tl: lambda x: hd if x else tl
virst = lambda l: l(True )
rrest = lambda l: l(False)

Vücudu parametre listesinden ayırmak için iki nokta üst üste olmadan, girintiyi kullanmam gerekirdi:

kons  = lambda hd, tl
    lambda x
        hd if x else tl

virst = lambda l
    l(True )

rrest = lambda l
    l(False)

Cobra'nın önceki sürümlerinin iki nokta üst üste işaretini isteğe bağlı hale getirdiğine inanıyorum, girintiyi, iki nokta üst üste işaretini veya her ikisini birden kullanabilirsiniz. Denetim ifadelerinin farklı bölümlerini ayırmak için anahtar kelimelerin bulunduğu Ruby'de nasıl çalıştığına benzer, ancak ifade ayırıcılarını da kullanabilirsiniz (noktalı virgül veya yeni satır):

# idiomatic
while true do puts "I am awesome" end
#          ↑↑

# non-idiomatic, but legal
while true; puts "I am awesome" end
#         ↑

# non-idiomatic, but legal
while true
puts "I am awesome" end

# idiomatic
while true
  puts "I am awesome"
end

Cobra'nın mevcut sürümlerinde virgül kullanabilirsiniz:

if x
    y

olarak yazılabilir

if x, y

İhtiyacınız bazı kontrol ifadeleri veya tanımların farklı bölümlerini ayıran yolu. Python'da bu kolon. Kolonu çıkarırsanız, başka bir şeyle değiştirmeniz gerekir, örneğin zorla girinti. Yalnızca iki nokta üst üste işaretinin kaldırılması işe yaramaz.

Kesin olarak emin olmanın tek yolu, sözdizimini iki nokta üst üste ve iki nokta üstüste resmileştirmek ve belirsizliğini kanıtlamaktır.

Bununla birlikte, Python Zen'in aforizmalarından birinin "Açık, Kapalı Örtüden Daha İyi" olduğuna dikkat edin, bu nedenle, iki nokta üst üste işaretli blokların açık bir şekilde tanımlanması, Python'un genel felsefesine uygun görünmektedir. Tasarım ve Tarih SSS ayrıca bu kararın Python'un öncülü ABC den ampirik kanıtlara dayalı olduğunu bahseder.


3
Son paragrafta açıklanan felsefe ile her satırın sonunda iki nokta üst üste işaretine ihtiyacınız olabilir. Açık vs örtük, yalnızca açık gerçekten bilgi eklerse anlamlıdır (ör. Örtük varyant belirsizdir). Sorumun konusu buydu.
Tomáš Zato - Monica'yı
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.