Python'da tek tırnak veya çift tırnak [kapalı]


718

Belgelere göre, hemen hemen değiştirilebilirler. Birini diğerinin üzerinde kullanmak için stilistik bir neden var mı?

Yanıtlar:


525

İnterpolasyon için kullanılan veya doğal dil mesajları olan dizelerin etrafında çift tırnak ve küçük sembol benzeri dizeler için tek tırnak kullanmayı seviyorum, ancak dizeler tırnak içeriyorsa veya unutursam kuralları kıracağım. Ihtiyaç duymasalar bile düzenli ifadeler için docstrings ve raw string literals için üçlü çift tırnak kullanıyorum.

Örneğin:

LIGHT_MESSAGES = {
    'English': "There are %(number_of_lights)s lights.",
    'Pirate':  "Arr! Thar be %(number_of_lights)s lights."
}

def lights_message(language, number_of_lights):
    """Return a language-appropriate string reporting the light count."""
    return LIGHT_MESSAGES[language] % locals()

def is_pirate(message):
    """Return True if the given message sounds piratical."""
    return re.search(r"(?i)(arr|avast|yohoho)!", message) is not None

4
İlginç, onları aynı şekilde kullanıyorum. Beni bu yönde sürüklemek için hiçbir şey okumadığımı hatırlamıyorum. Ayrıca ham html gibi insanlar için tasarlanmamış uzun dize için üçlü tek tırnak kullanın. Belki de İngilizce teklif kuralları ile ilgili bir şeydir.
Mike A

12
Çoğu python kodlayıcı bunu bu şekilde kodlar. Açık bir kural yoktur, ancak kodu sıklıkla bu şekilde okuduğumuz için, bu bir alışkanlık haline gelir.
e-satis

Sembol benzeri şeyler için tek tırnakların gerçekten Lisp / Scheme'deki alıntı ifadesi kısayolundan gelip gelmediğini merak ediyorum. Her durumda, sezgisel. Ayrıca, dostum, PEP 8 stil yönergelerini izliyorsak, işlevler gerçekten lights_message () ve is_pirate () olarak adlandırılmalıdır.
yukondude

8
Perl'in tek tırnaklı dizeler (enterpolasyon yok) ve çift tırnaklı dizeler (enterpolasyonlu) arasında bir ayrım yaptığını ve python kodlayıcıların alışkanlığı miras aldığını veya asla bırakmadığını düşünüyorum.
Daren Thomas

2
Ben aynı kural kullanın, artı vim SQL gibi üçlü tek tırnak içinde her şeyi vurgulayarak vahim.
RoundTower

96

Https://docs.python.org/2.0/ref/strings.html adresindeki resmi dokümanlardan alıntı :

Düz İngilizce: Dize değişmezleri eşleşen tek tırnak işaretleri (') veya çift tırnak işaretleri (") içine alınabilir.

Yani fark yok. Bunun yerine, insanlar size bağlamla eşleşen stili seçmenizi ve tutarlı olmanızı söyleyecektir . Ve kabul ediyorum - bu tür bir şey için "konvansiyonlar" bulmaya çalışmanın anlamsız olduğunu ekleyerek, çünkü sadece yeni gelenleri karıştıracaksınız.


3
evet, benim için tutarlılık çok önemli, bu yüzden sadece her yerde tekli kullanıyorum. Belirsiz ve tutarlı, daha az tuşa basma.
mlissner

90

Ben tercih ederdi 'özellikle, '''docstrings'''ben bulmak gibi """this creates some fluff""". Ayrıca, İsviçre Alman klavyemin anahtarı 'olmadan da yazılabilir Shift.

O zamandan beri PEP 257'ye"""docstrings""" uymak için üçlü tırnak kullanmaya geçtim .


2
Her gün SQL kodu yazdığım için tek tırnak tercih etme eğilimindeyim ve tek tırnaklar T-SQL'de dize değişmezleri için kullanılıyor. Ama üçlü çift tırnak kullanıyorum, çünkü docstrings bazen içlerinde biraz kabartmak kullanabilir.
eksortso

4
Dizeler için her yerde basit tırnak işaretleri kullanmak, kaynak kodunun parçalarını üç çift tırnak kullanarak devre dışı bırakmamı sağlar - '#if 0' ve '#endif'.
dim

12
"yalnızca PC QWERTY klavyesinde bir shift tuşu gerektirir. Klavyemde "aslında yazmak daha kolay.
e-satis

6
"ve her ikisi de üst karakter tuşunu gerektirir.
Loïc Faure-Lacroix

10
Bu cevap python konvansiyonuna aykırıdır; bkz. PEP 257: Tutarlılık için her zaman "" "üçlü çift tırnak" "" kullanın. python.org/dev/peps/pep-0257
Buttons840

44

Will ile birlikteyim:

  • Metin için çift tırnak
  • Tanımlayıcı gibi davranan her şey için tek tırnak
  • Normal ifadeler için çift tırnaklı ham dize değişmez değerleri
  • Doktrinler için üçlü çift tırnak

Çok fazla kaçış anlamına gelse bile buna bağlı kalacağım.

Tırnaklar nedeniyle öne çıkan tek tırnaklı tanımlayıcılardan en fazla değeri elde ediyorum. Uygulamaların geri kalanı, bu tek tırnaklı tanımlayıcılara ayakta durmak için vardır.


26

Sahip olduğunuz dize bir tane içeriyorsa, diğerini kullanmalısınız. Örneğin "You're able to do this",, veya 'He said "Hi!"'. Bunun dışında, olabildiğince tutarlı olmalısınız (bir modül içinde, bir paket içinde, bir proje içinde, bir kuruluş içinde).

Kodunuz C / C ++ ile çalışan kişiler tarafından okunacaksa (veya bu diller ve Python arasında geçiş yaparsanız), ''tek karakterli dizeler ve ""daha uzun dizeler için kullanmak geçişi kolaylaştırmaya yardımcı olabilir. (Aynı şekilde, değiştirilemedikleri diğer dilleri takip etmek için).

Ben vahşi gördüğüm Python kodu iyilik eğilimi "üzerinde 'ama sadece biraz. Tek istisna, gördüğümden """these"""çok daha yaygın '''these'''.



13
"If you're going to use apostrophes, 
       ^

you'll definitely want to use double quotes".
   ^

Bu basit sebepten ötürü dışarıda her zaman çift tırnak kullanıyorum. Her zaman

Kabartmadan bahsetmişken, kesme işaretlerini temsil etmek için kaçış karakterleri kullanmak zorunda kalacaksanız, dize değişmezlerinizi düzene sokmak ne işe yarar? Kodlayıcıları roman okumak rahatsız mı ediyor? Lise İngilizce dersinin senin için ne kadar acı verici olduğunu hayal edemiyorum!


11
'Eğer bir şey "teklif edecek" kesinlikle tek tırnak kullanmak isteyeceksiniz'
Paolo

Bunu yazdığımdan beri bu konudaki düşüncem büyük ölçüde değişti. Şimdi sadece çift tırnak kullanacağımı iddia edebileceğim bir durum. Bir diğeri tek tırnak kullanma bağlamında sizin olacaktır. Bkz kabul cevabı daha detaylı konuda benim şimdiki tutumundan ötürü. Geniş bir kitleye nasıl sunulması gerektiğine harika bir örnek olduğunu düşünüyorum.
Droogans

7

Python böyle bir şey kullanır:

mystringliteral1="this is a string with 'quotes'"
mystringliteral2='this is a string with "quotes"'
mystringliteral3="""this is a string with "quotes" and more 'quotes'"""
mystringliteral4='''this is a string with 'quotes' and more "quotes"'''
mystringliteral5='this is a string with \"quotes\"'
mystringliteral6='this is a string with \042quotes\042'
mystringliteral6='this is a string with \047quotes\047'

print mystringliteral1
print mystringliteral2
print mystringliteral3
print mystringliteral4
print mystringliteral5
print mystringliteral6

Hangi aşağıdaki çıktıyı verir:

this is a string with 'quotes'
this is a string with "quotes"
this is a string with "quotes" and more 'quotes'
this is a string with 'quotes' and more "quotes"
this is a string with "quotes"
this is a string with 'quotes'

2
Ancak """This is a string with "quotes""""bir SyntaxError oluşturur. Bu durum nasıl çözülebilir? (ile aynı '''This is a string with 'quotes'''')
dolma33 15:12

1
"Alıntılar" ve "" "arasına satır sonu ekle
Nicolas

1
@ dolma33 Nicolas'ın önerisi dizenin içeriğini değiştirir. Yanıtta daha iyi bir çözüm zaten var: dizeniz bir tür alıntıyla bitiyorsa, diğer üçlü alıntıyı kullanın. Ör '''This is a string with "quotes"'''.
jpmc26 17:14

3

Genel olarak çift tırnak kullanıyorum, ancak herhangi bir sebepten dolayı değil - Muhtemelen Java'dan alışkanlık yok.

Sanırım, satır içi değişmez bir dizede kesme işareti istemek de çift tırnak kullanmaktan daha olasıdır.


3

Şahsen ben biri ya da diğeri ile sopa. Önemli değil. Her iki alıntıya da kendi anlamınızı vermek, sadece işbirliği yaptığınızda diğer insanları karıştırmaktır.


2

Muhtemelen her şeyden çok stilistik bir tercih. Ben sadece PEP 8 kontrol ve tek ve çift tırnak herhangi bir söz görmedim.

Tek tırnakları tercih ederim çünkü iki yerine tek bir tuş vuruşu. Yani, tek bir alıntı yapmak için shift tuşunu ezmek zorunda değilim.


1
PEP 8, "Dokümantasyon Dizeleri" altındaki ilk cümlede PEP 257 ile bağlantı kurar. PEP 257'de şunu belirtir: Tutarlılık için her zaman "" "üçlü çift tırnak" "" kullanın. Dokümanlarınızda ters eğik çizgi kullanıyorsanız r "" "ham üçlü çift tırnak" "" kullanın. Unicode docstrings için u "" "Unicode üçlü alıntı dizeleri" "" kullanın. Yine de, tek bir teklifin temiz görünümünü ve verdiğiniz bir tuş vuruşunu seviyorum.
maxpolk

2

Perl'de, değişkenleri veya \ n, \ t, \ r vb. Gibi kaçan karakterleri enterpolasyona gerek olmayan bir dizeniz olduğunda tek tırnak kullanmak istiyorsunuz.

PHP, Perl ile aynı ayrımı yapar: değerlerinin yazdırılması için değişkenler içerebilen çift tırnakların aksine, tek tırnaklardaki içerik yorumlanmaz (\ n dönüştürülmez).

Python korkmuyor, korkuyorum. Teknik olarak, bir adı / metni Python'daki bir değişkenten ayırmak için $ jetonu (veya benzeri) yoktur. Her iki özellik de Python'u daha okunabilir, daha az kafa karıştırıcı yapar. Tek ve çift tırnaklar Python'da birbirinin yerine kullanılabilir.


Söylediklerinizi pekiştirmek için \ n sadece PHP ve Perl'de çift tırnak olarak yorumlanacak, Python'da ise hem çift hem de tek tırnak içinde çalışacak
stivlo

1
@stivlo: Dizgi rdeğişmezinin önüne ekleyerek işlenmemiş bir dize oluşturmazsanız . Böylece print 'a\nb'size iki satır yazdırır, ancak bir satır print r'a\nb'yazdırır.
Tadeck


1

Ben sadece o zaman benim fantezi vurur ne olursa olsun kullanın; bir kapris ile ikisi arasında geçiş yapabilmek uygun!

Tabii ki, alıntı karakterlerden alıntı yaparken, ikisi arasında geçiş yapmak sonuçta çok tuhaf olmayabilir ...


0

Ekibinizin tadı veya projenizin kodlama yönergeleri.

Çok dilli bir ortamdaysanız, örneğin diğer dilin kullandığı dizeler için aynı türde tırnakların kullanılmasını teşvik etmek isteyebilirsiniz. Else, ben şahsen '


0

Bildiğim kadarıyla yok. Bazı kodlara bakarsanız, "" genellikle metin dizeleri için kullanılır (sanırım 'metnin içinde "daha yaygındır) ve hashkey'lerde ve bunun gibi şeylerde' 'görünür.


0

Hem pikselleri hem de sürprizleri en aza indirmeyi hedefliyorum. Tipik olarak 'pikselleri küçültmek için tercih ederim , ancak "bunun yerine dize bir kesme işareti varsa, yine pikselleri küçültmek için. Bununla birlikte, bir doktora için tercih ederim """, '''çünkü ikincisi standart dışı, nadir ve bu nedenle şaşırtıcıdır. Şimdi "yukarıdaki mantığa göre kullandığım bir dizi dizim varsa, ama aynı zamanda bir ile kurtulabilen bir dizim varsa, yine de tutarlılığı korumak için 'kullanabilirim ", sadece sürprizleri en aza indirgemek için.

Belki de piksel küçültme felsefesini aşağıdaki şekilde düşünmeye yardımcı olur. İngilizce karakterlerin benzemesini A B Cister AA BB CCmisiniz? İkinci seçenek boş olmayan piksellerin% 50'sini harcar.


-1

Bash dışında çoğu dilde (C ++, Java, VB…) yıllardır yaptığım için çift tırnak kullanıyorum, çünkü normal metinde çift tırnak kullandığım ve (değiştirilmiş) İngilizce olmayan bir klavye kullandığım için her iki karakter için üst karakter tuşu gerekir.


-4

' = "

/= \=\\

misal :

f = open('c:\word.txt', 'r')
f = open("c:\word.txt", "r")
f = open("c:/word.txt", "r")
f = open("c:\\\word.txt", "r")

Sonuçlar aynı

= >> hayır, aynı değiller. Tek bir ters eğik çizgi karakterlerden kaçacaktır. Sen sırf örnekte dışarı şans olur \kve \wbenzeri geçerli kaçar değildir \tya \nya \\ya\"

Tek ters eğik çizgi kullanmak istiyorsanız (ve bu şekilde yorumlanmasını istiyorsanız), bir "raw" dizesi kullanmanız gerekir. Bunu rdizenin önüne bir ' ' koyarak yapabilirsiniz

im_raw = r'c:\temp.txt'
non_raw = 'c:\\temp.txt'
another_way = 'c:/temp.txt'

Windows'taki yollar söz konusu olduğunda, eğik çizgiler aynı şekilde yorumlanır. Açıkçası dize kendisi farklıdır. Yine de harici bir cihazda bu şekilde ele alındıklarını garanti etmem.


Kutsal saçmalık bu eski, ama yine de eğik çizgi kullanmanın pencereler için işe yarayabileceğini ancak yine de sisteme bağımlı olduğunu belirtmek istedim. İşletim sistemi bağımlılıklarından uzak durmak için aşağıdakileri kullanınos.path.join()
Adam Smith
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.