Python'daki bu uzun çizgiyi nasıl kırabilirim?


176

Bunun gibi uzun bir satırı biçimlendirmeye ne dersiniz? En fazla 80 karakter genişliğinde almak istiyorum:

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

Bu benim 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 neyi sevmiyorsun?
Hamish Grubijan

2
Biraz öznel, değil mi? :)
Adam Woś


14
Bir karakteri, "içindeki" yanlış olanını kaldırarak kaydedebilirsiniz.
jball

2
indexes: Doğru çoğul indexolup indices.
Scruffy

Yanıtlar:


336

Bu bir başlangıç. Uzun dizelerinizi, bunları kullanan kodun dışında tanımlamak kötü bir uygulama değildir. Bu, verileri ve davranışı ayırmanın bir yoludur. İlk seçeneğiniz, dizgi değişmezlerini birbirine bitişik yaparak dolaylı olarak birleştirmektir:

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

Veya bu işe yaradığı için biraz daha kırılgan olan satır sonu devamlarıyla:

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

Ancak bu şunları yapmaz:

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

Farkı gör? Hayır? Peki kodunuz olduğunda da yapmayacaksınız.

Örtülü birleştirmenin dezavantajı, değişkenlerden alınan dizelerle değil, yalnızca dizgi değişmezleriyle çalışmasıdır, böylece yeniden düzenlediğinizde işler biraz daha kıllı olabilir. Ayrıca, birleştirilmiş dize üzerinde biçimlendirmeyi yalnızca bir bütün olarak enterpole edebilirsiniz.

Alternatif olarak, birleştirme operatörünü ( +) kullanarak açıkça katılabilirsiniz :

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

Açık, örtük olmaktan daha iyidir, python'un zen'in söylediği gibi, ancak bu bir yerine üç dize oluşturur ve iki kat daha fazla bellek kullanır: yazdığınız iki artı ikisinin bir araya geldiği bir tane vardır, böylece zen'i ne zaman görmezden geleceğini bilmek zorundayım. Bunun tersi, her satırdaki alt dizelerin herhangi birine veya parantez dışından tüm partiye biçimlendirme uygulayabilmenizdir.

Son olarak, üç tırnaklı dizeler kullanabilirsiniz:

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

Bu genellikle benim favorimdir, ancak yeni satır ve sonraki satırlardaki önde gelen boşluklar son dizenizde görüneceğinden davranışı biraz farklıdır. Yeni satırı kaçan bir ters eğik çizgi ile ortadan kaldırabilirsiniz.

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

Bu, yukarıdaki aynı teknikle aynı soruna sahiptir, çünkü doğru kod sadece görünmez boşluktan yanlış koddan farklıdır.

Hangisinin "en iyi" olduğu özel durumunuza bağlıdır, ancak cevap sadece estetik değil, aynı zamanda ustaca farklı davranışlardan biridir.


26
CPython derleyicisi, değişmez işlemleri olabildiğince en iyi duruma getirir; bu, iki dize değişmezi eklemenin bayt kodunda yalnızca tek bir dize değişmeziyle sonuçlandığı anlamına gelir.
Ignacio Vazquez-Abrams

2
Aldığım tüm cevaplar yardımcı olsa da, sizinki kesinlikle dizeleri kırmanın tüm yollarını anlamama yardımcı oluyor. "\" Satırıyla ilgili sorun ondan sonra bir boşluk olduğunu mu sona erdirdi?
Gattster

1
Burada farkı göremiyorum, ama o zaman bu çoğunlukla SO'nun oldukça ilkel sözdizimi renginden kaynaklanıyor. (Bazı mükemmel iyi kodlar SO'da neredeyse okunamaz, ancak sadece sözdizimi C'ye çok yakın bir dilde olmadığı için) Nadiren yararlı (veya kasıtlı) oldukları için düzenleyicinizin sondaki boşlukları iğrenç bir şekilde vurgulaması olağandışı değildir. . :-)
Ken

1
'Bu dizeyi içermek için tek tırnak kullanabilir veya dizenizin içindeki çift tırnaklardan kaçabilir veya üçlü çift tırnak kullanabilirsiniz """. Tırnak işareti içeren tırnak içine alınmış dizelerle ilgili sorun, değişmez dizeyi tanımlamak için tek bir satır veya birden çok satır kullansanız da aynıdır.
hugovdberg

1
Düzenleyicim her zaman arka boşluğu kaldırır. Aynı ayarı etkinleştirmenizi öneririz. Tabii ki o zaman yeni satırdaki boşluk hala dizenin bir parçası, bu yüzden kullanarak sona erdi +.
ThaJay

46

Ardışık dize değişmezleri derleyici tarafından birleştirilir ve parantez içindeki ifadeler tek bir kod satırı olarak kabul edilir:

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

11

Şahsen açık blokları asılı sevmiyorum, bu yüzden şöyle biçimlendiririm:

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

Genel olarak, kodu tam olarak 80 sütunlu bir çizgiye sığdırmak için çok zorlanmayacağım. Hat uzunluğunu makul seviyelere indirmeye değer, ancak zor 80 sınırı geçmişte kaldı.


8
Gerçekten geçmişte kaldı. Python standart kütüphanesi hala stil rehberi olarak PEP8'i kullanıyor, bu yüzden kural hala var ve onu (birçok kişi dahil) takip ediyor. Çizgi çizmek için uygun bir yer.
Devin Jeanpierre

3
80 karakter kuralına hala kaç proje uyduğunu merak ediyorum. Kullandığım ortalama pencere boyutu için, 100-120'nin benim için 80 karakterden daha üretken olduğunu düşünüyorum.
Gattster

1
Evet, bu benim de kullandığım hat uzunluğuyla ilgili [korku! sacrilege!] Orantılı bir yazı tipi kullanıyorum, bu yüzden tam satır uzunluğu çok kritik değil. Tek bir satırdaki mantığın kaç karakterden daha fazla okunabileceğinin bir örneği daha fazla, örneğin ... Kimsenin okuması gereken uzun bir veri dizim varsa, dökülmesine izin vermekten mutluluk duyuyorum 120.
bobince

Kod için orantılı yazı tipleri - Seninleyim kardeşim. Şimdiye kadar birlikte çalıştığım herkesin onlar için sahip olduğu felakete bakılırsa, dünya hazır değil.
jlarcombe

4
~ 80 karakter aynı anda 2 dosyayı yan yana ayırmayı kolaylaştırır. Ayrıca, bir sunucunun konsolunda korkunç bir acil durum sırasında bir hata ayıklamanız 80 karakter sınırını gerçekten takdir edersiniz! :)
Mick T

4

Textwrap modülünü birden çok satıra bölmek için kullanabilirsiniz

import textwrap
str="ABCDEFGHIJKLIMNO"
print("\n".join(textwrap.wrap(str,8)))

ABCDEFGH
IJKLIMNO

Gönderen belgeler :

textwrap. wrap (text [, width [, ...]])
) Her paragrafı en geniş karakter uzunluğunda olacak şekilde tek paragrafı metinde (dize) sarar. Son satırsonu olmadan çıktı satırlarının bir listesini döndürür.

İsteğe bağlı anahtar kelime bağımsız değişkenleri TextWrapper, aşağıda belgelenen örnek niteliklerine karşılık gelir . genişlik varsayılan değerdir 70.

TextWrapper.wrap()Wrap () işlevinin nasıl davrandığına ilişkin ek ayrıntılar için yönteme bakın .


2

Ayrıca aramaya çalışıyor herkes için .format()uzun bir ipe ve sonraki bozmadan en popüler dize sarma bazı teknikleri kullanmak mümkün olmadığına .format(çağrı, yapabileceğiniz str.format("", 1, 2)yerine "".format(1, 2). Bu, dizeyi istediğiniz teknikle kırmanızı sağlar. Örneğin:

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

olabilir

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

Aksi takdirde, tek olasılık kişisel olarak hayran olmadığım satır sonu sürekliliklerini kullanmaktı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.