2010-01-13 7 views
103

Böyle uzun bir çizgi biçimlendirme hakkında nasıl giderdiniz? En fazla 80 karakter genişliğe sahip olmak istiyorum:Python'da bu uzun çizgiyi nasıl ayırabilirim?

logger.info("Skipping {0} because its thumbnail was already in our system as {1}.".format(line[indexes['url']], video.title)) 

Bu en iyi seçeneğim mi?

url = "Skipping {0} because its thumbnail was already in our system as {1}." 
logger.info(url.format(line[indexes['url']], video.title)) 
+1

İyi bir seçenek gibi görünüyor. Bu konuda ne sevmiyorsun? –

+2

Biraz öznel, değil mi? :) –

+1

ile ilgili: http://stackoverflow.com/questions/1940710/syntax-quirks-or-why-is-that-valid-python (python dizgisi dizgisi) – jldupont

cevap

213

Bu bir başlangıçtır. Uzun dizelerinizi kullanan kodun dışında tanımlamak kötü bir uygulama değildir. Veri ve davranışları ayırmanın bir yolu. İlk seçenek birbirine onları bitişik hale getirerek dolaylı bir araya dize hazır katılmaktır:

"This is the first line of my text, " \ 
"which will be joined to a second." 

Ama:

("This is the first line of my text, " 
"which will be joined to a second.") 

Ya da bu işleri gibi biraz daha kırılgan çizgi biten continuations ile

Bu yapmaz:

"This is the first line of my text, " \ 
"which will be joined to a second." 

fark görüyor musunuz? Yok hayır? Peki ya senin kodun da olmaz.

örtülü bir birleşimin olumsuz tarafı, yalnızca dize değişmezleriyle çalışmaktır, değişkenlerinden alınan dizelerle değil, bu nedenle işler yeniden katlanıldığında biraz daha kıllı olabilir. Ayrıca, birleştirilmiş dizgede yalnızca biçimlendirmeyi biçimlendirebilirsiniz.

Alternatif olarak, birleştirme operatörü (+) kullanılarak açıkça katılabilirsiniz: pitonun zen söylediği gibi

("This is the first line of my text, " + 
"which will be joined to a second.") 

Açık, örtülü daha iyidir, fakat bu üç dizeleri bir yerine oluşturur ve iki kez kullandığı çok fazla bellek: yazdığınız ikiniz var, artı ikisi birlikte bir araya geldi, bu yüzden zenleri ne zaman görmezden geleceğinizi bilmelisiniz. Üst kısımdaki formatları ile her satırda ayrı ayrı olarak veya parantezin dışındaki tüm lotlara ayrı ayrı uygulayabilirsiniz. Bu satır ve sonraki satırlarda herhangi önündeki boşluğun son dizede görünecektir olarak davranış biraz farklıdır, ancak, çoğu zaman benim favorim

"""This is the first line of my text 
which will be joined to a second.""" 

:

Son olarak, üçlü tırnakla kullanabilirsiniz . Yeni satırı kaçan bir ters eğik çizgi ile ortadan kaldırabilirsiniz. Doğru kod yalnızca görünmez boşluk hatalı kodundan farklı olarak

"""This is the first line of my text \ 
which will be joined to a second.""" 

Bu, yukarıda aynı teknikle aynı sorun vardır.

Hangisi "en iyisi" özel durumunuza bağlıdır, ancak cevap basitçe estetik değildir, ancak çok farklı davranışlardan biridir.

+15

CPython derleyicisi, mümkün olduğunca çok işlemin en iyi duruma getirilmesini sağlar; bu, iki dize değişmezinin eklenmesi, baytkodunda yalnızca tek bir dize değişkeni ile sonuçlanır. –

+1

Aldığım cevapların tümü size yardımcı olsa da, sizler kesinlikle dizeleri kırmanın tüm yollarını anlamama yardımcı oluyor. Sorun, bundan sonra bir boşluk olduğunu biten "\" satırında mıydı? – Gattster

+0

Buradaki farkı göremiyorum ama daha çok SO'nun oldukça ilkel sözdizimi renklendirmesi yüzünden. (Bazı mükemmel kodlar SO üzerinde neredeyse okunamaz durumdadır, ancak sadece sözdizimi C'ye çok yakın olan bir dilde olmadığından) editörünüzün nadiren yararlı olduklarından (veya kasıtlı olarak) ardışık boşlukları vurgulamakta alışılmadık bir durum değildir. . :-) – Ken

27

Ardıl dize hazır derleyici tarafından birleştirilir ve ifadeler tek bir kod satırı olarak kabul edilir parentezli:

logger.info("Skipping {0} because it's thumbnail was " 
    "already in our system as {1}.".format(line[indexes['url']], 
    video.title)) 
7

Şahsen açık bloklar asılı hoşlanmazlar, bu yüzden olarak biçimlendirmek istiyorum :

logger.info(
    'Skipping {0} because its thumbnail was already in our system as {1}.' 
    .format(line[indexes['url']], video.title) 
) 

Genelde ben tam bir 80 sütunlu hattı içindeki kod uyum olması için çok mücadele rahatsız olmaz. Hat uzunluğunu makul seviyelere indirmeye değer, ama zor 80 sınırı geçmişte kaldı.

+6

Bu gerçekten geçmişte bir şey değil. Python standart kitaplığı hala stil kılavuzu olarak PEP8'i kullanıyor, dolayısıyla kural hala var ve birçok kişi (ben dahil) onu takip ediyor. Çizgiyi çizmek için uygun bir yer. –

+2

80 char kuralı hala kaç proje izliyor acaba? Kullandığım ortalama pencere boyutu için 100-120'nin 80 karakterden daha verimli olduğunu düşünüyorum. – Gattster

+1

Evet, bu benim kullandığım çizgi uzunluğu ile ilgili de olsa [korku! sacrilege!] Orantılı bir yazı tipi kullanıyorum, bu yüzden kesin hat uzunluğu çok kritik değil. Tek bir satırda ne kadar mantığın kaç karakterden daha fazla okunabileceğine dair bir durumdur, öyle ki ... hiç kimsenin okuması gereken uzun bir veri dizim varsa, üzerine dökülmekten mutlu olurum 120. – bobince