Python kodundaki girintiyi parantezlere dönüştürmenin bir yolu var mı?


82

Python öğrenmek isteyen tamamen kör bir programcıyım. Maalesef, kod bloklarının farklı girinti seviyeleriyle temsil edilmesi, büyük bir tökezleyen bloktur. Parantez veya başka bir kod bloğu sınırlayıcı kullanarak kod yazmama ve ardından bu formatı Python yorumlayıcısının kullanabileceği düzgün girintili gösterime dönüştürmeme izin verecek herhangi bir araç olup olmadığını merak ediyordum.


Merak ettiğim için hangi işletim sistemini kullanıyorsunuz?
Ryan

4
Ama neden boşluklar ve çizgiler bir problemi çözüyor? Metin okuyucunun yazdırılamaz karakterler söylemesini sağlamak mümkün değil mi?
e-satis

2
Bu bir felaket reçetesi gibi görünüyor - her satırdan önce "uzay uzay uzay uzay uzay uzay boşluk boşluk" u dinlemek isteyen pek çok insan tanımıyorum.
javawizard

@javawizard "def foo kolon, sonraki satır, girinti artışı, ..." veya "girinti seviyesi 0, def foo kolon, sonraki satır girintisi seviyesi 1, ..."
belirterek çalışabilir

@smoothdeveloper Kesinlikle, ve posterin sorduğu da bu.
javawizard

Yanıtlar:


57

Probleminize python ile dağıtılan bir çözüm var. pindent.py, bir Windows kurulumunda Tools \ Scripts dizininde bulunur (benim yolum C: \ Python25 \ Tools \ Scripts), eğer çalıştırıyorsanız svn.python.org'dan almanız gerekecek gibi görünüyor Linux veya OSX.

Bloklar kapatıldığında yorumlar ekler veya yorumlar yerleştirilirse kodu düzgün şekilde girintileyebilir. Aşağıda pindent tarafından komutla çıkarılan kodun bir örneği verilmiştir:

pindent.py -c myfile.py

def foobar(a, b):
   if a == b:
       a = a+1
   elif a < b:
       b = b-1
       if b > a: a = a-1
       # end if
   else:
       print 'oops!'
   # end if
# end def foobar

Orijinalin myfile.pybulunduğu yer:

def foobar(a, b):
   if a == b:
       a = a+1
   elif a < b:
       b = b-1
       if b > a: a = a-1
   else:
       print 'oops!'

pindent.py -rYorumlara göre doğru girintiyi eklemek için de kullanabilirsiniz (ayrıntılar için pindent.py başlığını okuyun), bu, girinti konusunda endişelenmeden python'da kod yazmanıza izin vermelidir.

Örneğin, çalıştırma pindent.py -r myfile.pyaşağıdaki kodu, yukarıdaki örnekte myfile.pyüretilenle aynı düzgün şekilde girintili (ve ayrıca yorumlanmış) koda dönüştürür pindent.py -c:

def foobar(a, b):
if a == b:
a = a+1
elif a < b:
b = b-1
if b > a: a = a-1
# end if
else:
print 'oops!'
# end if
# end def foobar

Hangi çözümü kullandığınızı öğrenmek isterim, daha fazla yardıma ihtiyacınız olursa, lütfen bu yazıya yorum yapın, ben de yardımcı olmaya çalışacağım.


Olumsuz oy: Bu , kodu okumaya yardımcı olabilir , ancak kod yazmaya yardımcı olmaz. Python ve bunun gibi yalnızca yuvayı temsil etmek için boşluklara bağlı olan diller, görme engelliler için erişilebilirlik söz konusu olduğunda doğaları gereği kırılır. pindentSol taraftaki kodun tersini gerçekleştiren bir araç (birçok kör programcının tercih ettiği girinti şeması) yararlı olabilir . Daha kullanışlı olurdu from __future__ import braces- ama bir Paskalya yumurtası olarak değil.
David Hammen

1
@DavidHammen: var olan gerçekleştirir bir araç ters pindent.py -c; öyle pindent.py -r. Ryan, cevabında bunu zaten belirtti, ancak açık bir örnek eklemek ve gözden kaçırmayı zorlaştırmak için sadece düzenledim. (Ayrıca, bunu yapmak için komut satırı seçeneğini düzelttim: bu -r, -dyalnızca yorumları kaldıran değil .)
Ilmari Karonen

11

Kişisel olarak şu anda olduğundan şüpheliyim, çünkü birçok Python meraklısı Python'un bu şekilde, boşlukla sınırlandırılmış olduğu gerçeğini seviyor.

Aslında bunu bir erişilebilirlik sorunu olarak hiç düşünmedim. Belki de Python'a hata raporu olarak ileri sürülecek bir şeydir?

Bununla birlikte, çıktı için burada bir ekran okuyucu kullandığınızı varsayıyorum? Yani sekmeler size "görünmez" mi görünecek? Bir Braille çıktısıyla okumak daha kolay olabilir, ancak bunun ne kadar kafa karıştırıcı olabileceğini tam olarak anlayabiliyorum.

Aslında bu benim için çok ilginç. Keşke bunu sizin için yapacak bir uygulama yazabilecek kadar bilseydim.

Zaten kendiniz yapmadıysanız veya istemediyseniz, kesinlikle hata raporu yazacağım bir şey olduğunu düşünüyorum.

Düzenleme: Ayrıca, John Millikin tarafından belirtildiği gibi PyBraces de vardır.Bu sizin için uygulanabilir bir çözüm olabilir ve kodlama becerilerinize bağlı olarak tam olarak ihtiyacınız olan şey olması için birlikte hacklenmesi mümkün olabilir (ve umarım eğer durum buysa , sizin gibi başkalarının kullanması için yayınlarsınız

Düzenleme 2: Bunu biraz önce python hata izleyicisine bildirdim



6

Editörünüzü sekmeleri ve boşlukları söyleyecek şekilde yapılandırabilmelisiniz - çoğu düzenleyicide beyaz boşluk göstermenin mümkün olduğunu biliyorum , bu yüzden onları konuşacak bir yerde erişilebilirlik seçeneği olması gerekir.

Aksi takdirde, pratik bir şaka olarak yazılmış, ancak biraz çalışmayla sizin için gerçekten yararlı olabilecek pybraces var .


2
Ancak, belirli bir noktada, sekmelere bağlı bir kod bloğunda nerede olduğunuzu hatırlamanın zor olacağı gerçeğini düşünmelisiniz. Kaşlı ayraçlar belirli bir başlangıç ​​ve bitiş işaretini işaretler, oysa sekmelerle kafa karıştırıcı olabilir (Kafam karıştı ve görüştüm!)
Mez

6

Windows kullanıyorsanız, EdSharp'a şu adresten bakmanızı şiddetle tavsiye ederim: http://empowermentzone.com/EdSharp.htm Tüm önde gelen Windows ekran okuyucularını destekler, kodun girinti düzeylerini söyleyecek şekilde yapılandırılabilir, ya da PyBrace adlı yerleşik bir yardımcı programa sahiptir, bunun yerine bunu yapmak isterseniz ayraç sözdizimine veya sözdiziminden dönüşebilir ve programcıların metin editörlerimizden beklediği diğer tüm özellikleri destekler. Yıllardır PHP'den JavaScript'e, HTML'den Python'a kadar her şey için kullanıyorum ve onu seviyorum.


Son bir yıldır ana editörüm olarak kullanıyorum.
Jared

4

Sorununuzu takdir ediyorum, ancak çözmeniz gereken sorun yerine uygulamayı belirttiğinizi düşünüyorum. Kaşlı ayraçlara dönüştürmek yerine, ekran okuyucunuzun size girinti seviyesini söylemesi için bir yol üzerinde çalışmaya ne dersiniz?

Örneğin, bazı insanlar python girinti seviyelerini temsil etmek için vim sözdizimi renklendirmesi üzerinde çalıştılar. Belki de değiştirilmiş bir sözdizimi rengi, ekran okuyucunuzun okuyacağı bir şey üretebilir?


"4. seviye girinti" foo eşittir yeni çubuk "3. seviye girinti" Kafa karıştırıcı ve bunu aklınızda tutmak zorunda kalmak fazladan bir yük.
Mez

1
"Düzey N girintisi", "içeri" ve "dışarı" veya "girinti" ve "girinti" yeterli olmamalıdır. def foo (x): girinti dönüşü x * 2 dedent
kaleissin

4

Tüm bu "hayır yapamazsın" cevapları gerçekten can sıkıcıdır. Tabi ki yapabilirsin.

Bu bir hack, ama yapabilirsin.

http://timhatch.com/projects/pybraces/

yorumlayıcıya teslim etmeden önce parantezleri girintili bloklara dönüştürmek için özel bir kodlama kullanır.


Bir kenara ve python'da yeni biri olarak - küme ayraçlarına / genel blok sınırlayıcılara izin vermemenin arkasındaki mantığı kabul etmiyorum ... python geliştiricilerin tercihi olması dışında. Kodunuzu otomatik olarak işliyorsanız veya beyaz boşluğun önemli olduğunu anlamayan bir düzenleyicide çalışıyorsanız, en azından kaşlı ayraçlar yanlışlıkla yenilmez. Otomatik olarak kod oluşturuyorsanız, girinti seviyelerini takip etmek zorunda kalmamak kullanışlıdır. Bir perl-esque one-lineer yapmak için python kullanmak istiyorsanız, otomatik olarak sakat kalırsınız. Hiçbir şey değilse, sadece bir koruma olarak. Ya 1000 satırlık python programınız tüm sekmeleri yenirse? Satır satır ilerleyip girintinin nerede olması gerektiğini mi anlayacaksınız?

Bunu sormak, her zaman "sadece yap" gibi __ gelecek __ kaşlı ayraçları içe aktar "", "IDE'nizi doğru şekilde yapılandırın", "yine de daha iyidir, bu yüzden buna alışın" gibi bir dil yanıtı alacaktır ...

Ne demek istediğini anlıyorum, ama hey, eğer istersem, her satırdan sonra noktalı virgül koyabilirim. Bu yüzden herkesin diş telleri konusunda neden bu kadar kararlı olduğunu anlamıyorum. Dilinizin sizi düzgün bir şekilde girmeye zorlamasına ihtiyacınız varsa, ilk başta bunu doğru yapmıyorsunuzdur.

Sadece benim 2c - yine de diş teli kullanacağım.


bir python kabuğu açmanız ve şunu girmeniz gerekir: bunu içe aktar
ThatAintWorking

1
Nitekim, benim görüşüm deneyim yoluyla etkilendi. Python'u projelerimden birinin ihtiyaçlarına uymaya zorlamanın bir yolunu bulmaya çalışıyordum ve herhangi bir ikna yoluyla bunu yapmayı reddettiğini görünce hayal kırıklığına uğradım. Buna farklı bir açıdan geldim ve python'un çalışmak için güzel ve son derece işbirlikçi bir platform olduğunu keşfettim. Algoritmaları ayrıştırma konusunda derinlemesine bir çalışma yapmak zorunda kaldım, ancak edindiğim bilgiler buna değer. Hala girinti / çıkıntı umurumda değil, ama onlara saygı duyuyorum.
la11111

4

Erişilebilir bir Python IDE'yi araştırırken, bunu buldu ve cevaplamaya karar verdi. JAWS ile Windows altında:

  1. Favori metin düzenleyicinizde JawsKey+ 6(harflerin üzerindeki sayı satırında) tuşuna basarak Ayarlar Merkezine gidin . JAWS yeni bir yapılandırma dosyası oluşturmanızı isterse, kabul edin.
  2. Arama alanına "girinti" yazın
  3. Yalnızca bir sonuç olacaktır: "Girintili karakterleri söyle". Bunu aç.
  4. Zevk almak!

Bizim için sinir bozucu olan tek şey, web sitelerindeki kod örneklerinin keyfini çıkaramamamızdır (çünkü tarayıcılarda girinti konuşmak çok rahat değildir - gereksiz konuşma üretir).

Yeni bir Python'dan mutlu kodlama).


3

Eclipse'i pydev uzantıları ile kullanıyorum, çünkü bu bir IDE'yle ilgili çok deneyimim var. Ayrıca if ifadeleri, döngüler vb. Kodlama için sunduğu akıllı girintiyi de takdir ediyorum. Pindent.py betiğini şu anda odaklanmış python modülünde çalıştırabileceğim harici bir araç olarak yapılandırdım, bu da hayatımı kolaylaştırıyor, böylece ne olduğunu görebilirim. sürekli girintiyi kontrol etmek zorunda kalmadan nerede kapalı.


1

Bunun nasıl yapılacağını açıklayan çeşitli cevaplar var. Ancak bu yolu seçmemenizi tavsiye ederim. Dönüşümü yapmak için bir komut dosyası kullanabilirsiniz, ancak bir ekip projesi üzerinde çalışmayı zorlaştırır.

Benim önerim, ekran okuyucunuzu sekmeleri duyuracak şekilde yapılandırmanız olacaktır. Bu göründüğü kadar can sıkıcı değil, çünkü "sekme sekmesi sekme sekmesi" yerine yalnızca "girinti 5" diyor. Ayrıca, girinti yalnızca her değiştiğinde okunur, böylece girinti seviyesini duymadan tüm bir kod bloğundan geçebilirsiniz. Bu şekilde girintiyi duymak, diş tellerini duymaktan daha ayrıntılı değildir.

Hangi işletim sistemini veya ekran okuyucuyu kullandığınızı bilmediğim için maalesef bunu başarmak için tam adımları veremiyorum.


0

Edsger Dijkstra kullanılan ~ eğer fi ve ~ od yapmak onun "Güvenlikli Komut Dili", bu kaynaklandığı görülmektedir Algol68 . RosettaCode.org'da kullanılan bazı örnek python korumalı bloklar da vardı .

fi = od = yrt = end = lambda object: None;
class MyClass(object):
    def myfunction(self, arg1, arg2):
        for i in range(arg1) :# do
            if i > 5 :# then
                print i
            fi
        od # or end(i) #
    end(myfunction)
end(MyClass)

Beyaz boşluk karıştırılmış python kodu, eğer / fi, do / od & try / yrt noktalı virgüllerle birlikte kullanıldığında korumalı bloklar kullanılıyorsa açık bir şekilde çözülebilir ve yeniden girilebilir ";" ifadeleri ayırmak için. Net dergi listeleri veya web sayfalarından kesme / yapıştırma için mükemmel.

Koruma bloklarını ve noktalı virgülleri eklemek / kaldırmak için kısa bir python programı yazmak yeterince kolay olmalıdır.

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.