Python'da nasıl satır sonu (satır devam) yapabilirim?


1075

Birden çok satır arasında ayrılmak istediğiniz kod uzun bir satır var. Ne kullanırım ve sözdizimi nedir?

Örneğin, bir grup dizeyi eklemek,

e = 'a' + 'b' + 'c' + 'd'

ve böyle iki satıra sahip olun:

e = 'a' + 'b' +
    'c' + 'd'

Yanıtlar:


1211

Çizgi nedir? Bir sonraki satırda herhangi bir problem yaşamadan argümanlarınız olabilir:

a = dostuff(blahblah1, blahblah2, blahblah3, blahblah4, blahblah5, 
            blahblah6, blahblah7)

Aksi takdirde böyle bir şey yapabilirsiniz:

if a == True and \
   b == False

Kontrol stil rehberi Daha fazla bilgi için.

Örnek satırınızdan:

a = '1' + '2' + '3' + \
    '4' + '5'

Veya:

a = ('1' + '2' + '3' +
    '4' + '5')

Stil kılavuzunun, parantezle örtülü sürdürmenin kullanılmasının tercih edildiğini, ancak bu durumda yalnızca ifadenizin etrafına parantez eklemenin muhtemelen yanlış yol olduğunu söylediğini unutmayın.


35
Aslında, stil kılavuzunun tercihi tam olarak geriye doğru. Kapalı devam tercih edilir, açık ters eğik çizgi yalnızca gerektiğinde kullanılmalıdır.
Carl Meyer

35
Carl: Katılıyorum, bu rehberden: Uzun çizgileri sarmanın tercih edilen yolu, Python'un parantez, parantez ve parantez içindeki zımni çizgi devamını kullanmaktır. Gerekirse, bir ifadenin etrafına fazladan bir çift parantez ekleyebilirsiniz, ancak bazen ters eğik çizgi kullanmak daha iyi görünür.
Jerub

15
Stil kılavuzu alıntısının temel kısmı "Gerekirse, bir ifadenin etrafına fazladan bir çift parantez ekleyebilirsiniz, ancak bazen ters eğik çizgi kullanmak daha iyi görünür." Stil kılavuzu edilir değil sen gerektiğini söyleyerek eklemek o yazarın yargısına bırakır, parantez.
Tony Meyer

23
Muhtemelen bu yorumlar eklendiğinden beri PEP-8 değişmiştir, çünkü artık uzun satırları sarmak için parantezlerin eklenmesi gerektiği açıktır: "Uzun satırlar, ifadeleri parantezlere sarılarak birden fazla satırdan kesilebilir."
Daniel

46
PEP8 gerçekten 2010'da değişti - "bazen ters eğik çizgi kullanmak daha iyi görünüyor" gitti.
e100

230

Gönderen PEP 8 - Python Kodu Stil Kılavuzu :

Uzun çizgileri sarmanın tercih edilen yolu, Python'un parantezler, parantezler ve parantez içindeki zımni çizgi devamını kullanmaktır. Uzun satırlar, ifadeleri parantez içinde sararak birden çok satır üzerinde kesilebilir. Bunlar hattın devamı için ters eğik çizgi kullanılmasına tercih edilmelidir.

Ters eğik çizgiler zaman zaman uygun olabilir. Örneğin, uzun, çoklu ifadelerle örtülü devam kullanılamaz, bu nedenle ters eğik çizgiler kabul edilebilir:

with open('/path/to/some/file/you/want/to/read') as file_1, \
        open('/path/to/some/file/being/written', 'w') as file_2:
    file_2.write(file_1.read())

Böyle bir diğer dava da iddia beyanları ile ilgilidir.

Devam eden satırı uygun şekilde girintili yaptığınızdan emin olun. İkili bir operatörün çevresinde kırılmak için tercih edilen yer , operatörden önce değil, operatörden sonradır . Bazı örnekler:

class Rectangle(Blob):

    def __init__(self, width, height,
                 color='black', emphasis=None, highlight=0):
        if (width == 0 and height == 0 and
                color == 'red' and emphasis == 'strong' or
                highlight > 100):
            raise ValueError("sorry, you lose")
        if width == 0 and height == 0 and (color == 'red' or
                                           emphasis is None):
            raise ValueError("I don't think so -- values are %s, %s" %
                             (width, height))
        Blob.__init__(self, width, height,
                      color, emphasis, highlight)

PEP8 artık karşıt sözleşmeyi öneriyor , matematikçiler ve yayıncıları tarafından okunabilirliği artırmak için kullanılan (ikili işlemlerde kırılma için) .

Donald Knuth'un ikili bir operatörden önce kırılma tarzı, operatörleri dikey olarak hizalar, böylece hangi öğelerin ekleneceğini ve çıkarılacağını belirlerken gözün iş yükünü azaltır.

Gönderen : PEP8 Should önce veya bir ikili operatör sonra satır sonu? :

Donald Knuth, Bilgisayarlar ve Dizgi dizisindeki geleneksel kuralı şöyle açıklıyor: "Bir paragraf içindeki formüller her zaman ikili işlemler ve ilişkilerden sonra kırılsa da, görüntülenen formüller her zaman ikili işlemlerden önce kırılır" [3].

Matematik geleneğini takip etmek genellikle daha okunabilir bir kodla sonuçlanır:

# Yes: easy to match operators with operands
income = (gross_wages
          + taxable_interest
          + (dividends - qualified_dividends)
          - ira_deduction
          - student_loan_interest)

Python kodunda, kural yerel olarak tutarlı olduğu sürece ikili bir operatörden önce veya sonra kırılmasına izin verilir. Yeni kod için Knuth'un tarzı önerilmektedir.

[3]: Donald Knuth'un TeXBook'u, sayfa 195 ve 196


3
Not 2010'da tavsiye değiştirildi: "Uzun satırlar, parantez içinde ifadeler sarılarak kesilebilir. Bunlar ters eğik çizgi kullanılmasına tercih edilmelidir ..." ve tüm ters eğik çizgiler kod örneğinden kaldırıldı.
e100

1
@ e100: yukarıdaki metni kalın harflerle okuyun: The preferred way .. is by using Python's implied line continuation inside parenthesesile aynı şey by wrapping expressions in parentheses. Örneği güncelledim
jfs

10
Ancak "bazen ters eğik çizgi kullanmanın daha iyi göründüğünü" de unutmayın.
e100

1
@ e100: ters eğik çizgilerin kodu daha okunaklı hale getirdiği üç kod örneği : "bazen stil kılavuzu geçerli değil. Şüphe
jfs

6
2015 yılında stil kılavuzu, okunabilirlikteki algılanan gelişmeler nedeniyle Donald Knuth'un araştırmasından sonra ikili operatörlerden önce kırılmayı tercih edecek şekilde güncellendi .
J2C

70

Bir çizgiyi sonlandırmak için ters eğik çizgi kullanmanın tehlikesi, ters eğik çizgiden sonra boşluk eklenirse (ki, elbette, görmek çok zordur), ters eğik çizginin artık düşündüğünüzü yapmamasıdır.

Daha fazla bilgi için bkz. Python Deyimleri ve Anti-Deyimler ( Python 2 veya Python 3 için ).


8
Bu, sondaki boşlukları daha iyi görebilmenin güzel bir nedenidir; yani set list listchars=trail:·vim gibi bir şey . :)
Beau

25

\Satırın sonuna bir a koyun veya ifadeyi parens içine alın ( .. ). Gönderen IBM :

b = ((i1 < 20) and
     (i2 < 30) and
     (i3 < 40))

veya

b = (i1 < 20) and \
    (i2 < 30) and \
    (i3 < 40)

24

Parantez ve kaşlı ayraçlar arasındaki çizgileri kesebilirsiniz. Ayrıca, \bir çizgiye ters eğik çizgi karakterini , açıkça kırmak için ekleyebilirsiniz :

x = (tuples_first_value,
     second_value)
y = 1 + \
    2

20

Atın ağzından: Açık birleşme

İki veya daha fazla fiziksel çizgi, ters eğik çizgi karakterleri ( \) kullanılarak mantıksal çizgilere birleştirilebilir : fiziksel bir çizgi, bir dizgi değişmezinin veya yorumunun parçası olmayan bir ters eğik çizgi ile sona erdiğinde, tek bir mantıksal çizgi oluşturarak aşağıdakilerle birleştirilir , ters eğik çizgiyi ve aşağıdaki satır sonu karakterini silme. Örneğin:

if 1900 < year < 2100 and 1 <= month <= 12 \
   and 1 <= day <= 31 and 0 <= hour < 24 \
   and 0 <= minute < 60 and 0 <= second < 60:   # Looks like a valid date
        return 1

Ters eğik çizgi ile biten bir satır yorum taşıyamaz. Ters eğik çizgi bir yoruma devam etmez. Ters eğik çizgi, dize değişmez değerleri dışında bir jetona devam etmez (yani dize değişmez değerleri dışındaki jetonlar, ters eğik çizgi kullanılarak fiziksel çizgiler arasında bölünemez). Ters eğik çizgi, bir dizgi değişmezinin dışındaki bir çizgide başka bir yerde yasadışıdır.


7
-1 çünkü örnek unidiomatic IMO'dur. Bileşik koşullarında bunun yerine kesinlikle parantez bulunabilir; bu daha pratik (düzenleme veya otomatik yeniden sarma için) ve deyimseldir.
u0b34a0f6ae

4

Pythonic yolu olmayabilir, ancak genellikle SQL sorguları gibi uzun bir dize yazmak için join işleviyle bir liste kullanın:

query = " ".join([
    'SELECT * FROM "TableName"',
    'WHERE "SomeColumn1"=VALUE',
    'ORDER BY "SomeColumn2"',
    'LIMIT 5;'
])

2

Otostopçunun Python Rehberinden Alınan ( Hattın Devamı ):

Mantıksal bir kod satırı kabul edilen sınırdan daha uzunsa, kodu birden çok fiziksel satıra bölmeniz gerekir. Satırın son karakteri ters eğik çizgi ise Python yorumlayıcısı ardışık satırları birleştirir. Bu bazı durumlarda yardımcı olur, ancak kırılganlığı nedeniyle genellikle kaçınılmalıdır: ters eğik çizgiden sonra çizginin sonuna eklenen beyaz boşluk kodu kıracak ve beklenmedik sonuçlara neden olabilir.

Daha iyi bir çözüm, öğelerinizde parantez kullanmaktır.Satır sonu üzerinde kapatılmamış bir parantez bırakıldığında, Python yorumlayıcısı parantez kapatılana kadar bir sonraki satıra katılır. Aynı davranış kıvırcık ve kare ayraçlar için de geçerlidir.

Bununla birlikte , çoğu zaman, uzun bir mantıksal çizgiyi bölmek, aynı anda çok fazla şey yapmaya çalıştığınızın, okunabilirliği engelleyebilecek bir işarettir.

Bununla birlikte, genel olarak dizelere de uygulanan çoklu ithalatı ( PEP-8'de tanımlanan çizgi sınırlarını aşarken ) dikkate alan bir örnek :

from app import (
    app, abort, make_response, redirect, render_template, request, session
)

1

Uzun bir değişmez dizge nedeniyle satırınızı kırmak istiyorsanız, bu dizeyi parçalara ayırabilirsiniz:

long_string = "a very long string"
print("a very long string")

ile değiştirilecek

long_string = (
  "a "
  "very "
  "long "
  "string"
)
print(
  "a "
  "very "
  "long "
  "string"
)

Her iki yazdırma ifadesi için çıktı:

a very long string

Etkilenen parantezlere dikkat edin.

Değişmez dizeleri parçalara ayırmanın değişmez önekin yalnızca dizenin bazı bölümlerinde kullanılmasına izin verdiğine dikkat edin:

s = (
  "2+2="
  f"{2+2}"
)

0

Kullanım satır devam operatörü yani "\"

Örnekler:

# Ex.1

x = 1
s =  x + x**2/2 + x**3/3 \
       + x**4/4 + x**5/5 \
       + x**6/6 + x**7/7 \
       + x**8/8
print(s)
# 2.7178571428571425


----------


# Ex.2

text = ('Put several strings within parentheses ' \
        'to have them joined together.')
print(text)


----------


# Ex.3

x = 1
s =  x + x**2/2 \
       + x**3/3 \
       + x**4/4 \
       + x**6/6 \
       + x**8/8
print(s)
# 2.3749999999999996
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.