Pojedyncze cudzysłowy vs. podwójne cudzysłowy w Pythonie [zamknięte]


718

Według dokumentacji są one prawie wymienne. Czy istnieje stylistyczny powód, aby używać jednego nad drugim?

Odpowiedzi:


525

Lubię używać podwójnych cudzysłowów wokół ciągów używanych do interpolacji lub komunikatów w języku naturalnym oraz pojedynczych cudzysłowów dla małych ciągów podobnych do symboli, ale złamie zasady, jeśli ciągi zawierają cudzysłowy lub jeśli zapomnę. Używam potrójnych podwójnych cudzysłowów dla dokumentów i surowych literałów łańcuchowych dla wyrażeń regularnych, nawet jeśli nie są one potrzebne.

Na przykład:

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
Co ciekawe, używam ich dokładnie w ten sam sposób. Nie pamiętam, aby kiedykolwiek czytać coś, co popychałoby mnie w tym kierunku. Używam także potrójnych pojedynczych cudzysłowów dla długiego łańcucha nieprzeznaczonego dla ludzi, takiego jak surowy HTML. Może ma to coś wspólnego z angielskimi zasadami wyceny.
Mike A

12
Większość koderów Pythona koduje to w ten sposób. Nie ma wyraźnej reguły, ale ponieważ często czytamy kod w ten sposób, staje się on nawykiem.
e-satis

Zastanawiam się, czy pojedyncze cudzysłowy dla rzeczy podobnych do symboli faktycznie pochodzą ze skrótu wyrażenia cytowania w Lisp / Scheme. W każdym razie jest to intuicyjne. Również, moi koledzy, jeśli postępujemy zgodnie ze wskazówkami stylu PEP 8, funkcje naprawdę powinny nazywać się lights_message () i is_pirate ().
yukondude

8
Myślę, że Perl wprowadził rozróżnienie między łańcuchami pojedynczego cudzysłowu (bez interpolacji) i łańcuchami podwójnego cudzysłowu (z interpolacją) i że kodery python mogły odziedziczyć nawyk lub nigdy go nie puścić.
Daren Thomas

2
Używam tej samej konwencji, a ponadto nadużywam tego, ponieważ vim wyróżnia wszystko w potrójnych pojedynczych cudzysłowach jako SQL.
RoundTower

96

Cytując oficjalne dokumenty na https://docs.python.org/2.0/ref/strings.html :

W prostym języku angielskim: literały łańcuchowe mogą być ujęte w pasujące pojedyncze cudzysłowy (') lub podwójne cudzysłowy (").

Więc nie ma różnicy. Zamiast tego ludzie powiedzą ci, aby wybrać styl pasujący do kontekstu i zachować spójność . I zgodziłbym się - dodając, że nie ma sensu wymyślać „konwencji” dla tego rodzaju rzeczy, ponieważ tylko wprowadzisz zamieszanie w nowych przybyszach.


3
tak, dla mnie najważniejsza jest konsekwencja, więc wszędzie używam singli. Mniej naciśnięć klawiszy, jednoznacznych i spójnych.
mlissner,

90

Wolałem ', szczególnie '''docstrings''', jak się przekonałem """this creates some fluff""". Ponadto 'można pisać bez Shiftklawisza na mojej szwajcarskiej niemieckiej klawiaturze.

Od tego czasu zmieniłem się na stosowanie potrójnych cudzysłowów dla """docstrings""", aby dostosować się do PEP 257 .


2
Wolę pojedyncze cytaty, ponieważ piszę kod SQL codziennie, a w literaturze łańcuchowej w T-SQL używane są pojedyncze cudzysłowy. Ale używam potrójnych podwójnych cudzysłowów, ponieważ dokumenty mogą czasami używać trochę puchu.
eksortso

4
Używanie wszędzie prostych cytatów dla ciągów pozwala mi wyłączyć części kodu źródłowego za pomocą trzech podwójnych cudzysłowów - rodzaj „#if 0” i „#endif”.
dim

12
"wymaga klawisza Shift tylko na klawiaturze komputera QWERTY. Na mojej klawiaturze "łatwiej jest pisać.
e-satis

6
na moim keyboardzie ”i„ oba wymagają klawisza Shift ”
Loïc Faure-Lacroix

10
Ta odpowiedź jest sprzeczna z konwencją Pythona; patrz PEP 257, który mówi: Aby zachować spójność, zawsze używaj potrójnych podwójnych cudzysłowów „” „” wokół dokumentów. python.org/dev/peps/pep-0257
Buttons840

44

Jestem z Willem:

  • Podwójne cudzysłowy dla tekstu
  • Pojedyncze cudzysłowy dla wszystkiego, co zachowuje się jak identyfikator
  • Podwójne cudzysłowy surowe ciągi literowe dla wyrażeń regularnych
  • Potrójne podwójne cudzysłowy dla dokumentów

Pozostanę przy tym, nawet jeśli to oznacza dużo ucieczki.

Największą wartość czerpię z identyfikatorów pojedynczych cytatów wyróżniających się ze względu na cytaty. Reszta praktyk ma na celu zapewnienie tym stojącym pojedynczym identyfikatorom trochę miejsca na stojąco.


26

Jeśli ciąg, który masz zawiera jeden, powinieneś użyć drugiego. Na przykład "You're able to do this", lub 'He said "Hi!"'. Poza tym powinieneś być tak spójny, jak tylko możesz (w module, w pakiecie, w projekcie, w organizacji).

Jeśli twój kod będzie czytany przez osoby pracujące z C / C ++ (lub jeśli przełączysz się między tymi językami a Pythonem), to użycie ''ciągów jednoznakowych i ""dłuższych może ułatwić przejście. (Podobnie w przypadku innych języków, w których nie są one wymienne).

Kod Python widziałem w naturze ma tendencję do faworyzowania "nad ', ale tylko nieznacznie. Jedynym wyjątkiem jest to, że """these"""są znacznie częstsze niż '''these'''z tego, co widziałem.


21

Ciekawe podtemat tego pytania stanowią trzy cytowane komentarze. PEP 257 określa potrójne cudzysłowy dla ciągów dokumentów . Zrobiłem szybkie sprawdzenie za pomocą Google Code Search i odkryłem, że potrójne podwójne cudzysłowy są w Pythonie około 10 razy bardziej popularne niż potrójne pojedyncze cudzysłowy - 1,3 mln w porównaniu z 131 000 wystąpień w indeksach Google kodu. Więc w przypadku wielu linii twój kod prawdopodobnie będzie bardziej znany ludziom, jeśli użyje potrójnych podwójnych cudzysłowów.


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

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

Z tego prostego powodu zawsze używam podwójnych cudzysłowów na zewnątrz. Zawsze

Skoro mowa o puchu, co dobrego jest w usprawnianiu literałów łańcuchowych słowem „jeśli będziesz musiał użyć znaków specjalnych do reprezentowania apostrofów? Czy obraża programistów czytających powieści? Nie wyobrażam sobie, jak bolesna była dla ciebie klasa angielskiego w liceum!


11
„Jeśli zamierzasz„ zacytować ”coś, na pewno będziesz chciał użyć pojedynczych cudzysłowów”
Paolo

Moje zdanie bardzo się zmieniło od czasu, gdy to napisałem. Teraz jest to po prostu jedna z sytuacji, w których argumentowałbym, że użyłbym podwójnych cudzysłowów. Kolejny byłby twój w kontekście korzystania z pojedynczych cudzysłowów. Bardziej szczegółowo zobacz zaakceptowaną odpowiedź na moje obecne stanowisko w tej sprawie. Myślę, że to świetny przykład tego, jak powinien być zaprezentowany szerokiej publiczności.
Droogany

7

Python używa cudzysłowów mniej więcej tak:

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

Co daje następujące dane wyjściowe:

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
Ale """This is a string with "quotes""""podnosi błąd SyntaxError. Jak można rozwiązać tę sytuację? (tak samo jak z '''This is a string with 'quotes'''')
dolma33

1
Wstaw podział między „cudzysłowami” a „” „
Nicolas

1
@ dolma33 Sugestia Nicolasa zmieniłaby treść ciągu. Lepsze rozwiązanie już znajduje się w odpowiedzi: jeśli łańcuch kończy się cytatem, użyj innego potrójnego cytatu. Np '''This is a string with "quotes"'''.
jpmc26

3

Używam podwójnych cudzysłowów, ale nie z żadnego konkretnego powodu - prawdopodobnie po prostu z przyzwyczajenia z Javy.

Wydaje mi się, że bardziej prawdopodobne jest, że będziesz chciał apostrofów w dosłownym ciągu literalnym niż podwójnych cudzysłowów.


3

Osobiście trzymam się jednego lub drugiego. To nie ma znaczenia Podanie własnego znaczenia któregoś z cytatów jest po prostu mylące innych ludzi podczas współpracy.


2

To chyba stylistyczna preferencja bardziej niż cokolwiek innego. Właśnie sprawdziłem PEP 8 i nie widziałem żadnej wzmianki o pojedynczych i podwójnych cudzysłowach.

Wolę pojedyncze cudzysłowy, ponieważ jest to tylko jedno naciśnięcie klawisza zamiast dwóch. Oznacza to, że nie muszę zaciskać klawisza Shift, aby utworzyć pojedynczy cytat.


1
PEP 8 łączy się z PEP 257 w pierwszym zdaniu w „Ciągach dokumentacji”. W PEP 257 stwierdza: Aby zachować spójność, zawsze używaj potrójnych podwójnych cudzysłowów „” „” wokół dokumentów. Użyj r "" "surowych potrójnych podwójnych cudzysłowów" "", jeśli użyjesz ukośników odwrotnych w swoich ciągach dokumentów. W przypadku ciągów znaków Unicode użyj potrójnego cudzysłowu „” „”. Mimo to podoba mi się czysty wygląd pojedynczego cytatu i jedyny powód, dla którego podałeś klucz.
maxpolk

2

W Perlu chcesz używać pojedynczych cudzysłowów, gdy masz ciąg znaków, który nie musi interpolować zmiennych lub znaków specjalnych, takich jak \ n, \ t, \ r itp.

PHP robi to samo rozróżnienie, co Perl: treść w pojedynczych cudzysłowach nie będzie interpretowana (nawet \ n nie zostanie przekonwertowana), w przeciwieństwie do podwójnych cudzysłowów, które mogą zawierać zmienne w celu wydrukowania ich wartości.

Obawiam się, że Python nie. Technicznie rzecz biorąc, nie ma $ token (lub podobnego), aby oddzielić nazwę / tekst od zmiennej w Pythonie. Obie funkcje sprawiają, że Python jest bardziej czytelny, w końcu mniej mylący. Pojedyncze i podwójne cudzysłowy mogą być używane zamiennie w Pythonie.


Aby wzmocnić to, co mówisz, \ n będzie interpretowane tylko w podwójnych cudzysłowach w PHP i Perlu, podczas gdy w Pythonie będzie działać zarówno w podwójnych, jak i pojedynczych cudzysłowach
stivlo

1
@stivlo: O ile nie zrobisz z niego surowego łańcucha, dodając rprzed literałem łańcucha. Więc print 'a\nb'wypisze ci dwie linie, ale print r'a\nb'pozwoli Ci wydrukować jeden.
Tadeck


1

Po prostu używam tego, co mi się wtedy podoba; wygodnie jest móc przełączać się między nimi jednym kaprysem!

Oczywiście, cytując bohaterów cytatów, przełączanie się między nimi może nie być wcale takie kapryśne ...


0

Smak twojego zespołu lub wytyczne kodowania twojego projektu.

Jeśli pracujesz w środowisku wielojęzycznym, możesz zachęcić do korzystania z tego samego rodzaju cudzysłowów dla ciągów znaków, na przykład w innym języku. W przeciwnym razie osobiście najbardziej lubię wygląd „


0

Żadne, o ile mi wiadomo. Chociaż, jeśli spojrzysz na jakiś kod, „” jest zwykle używane w przypadku ciągów tekstowych (chyba „częściej występuje w tekście niż”), a „” pojawia się w hashkeys i podobnych rzeczach.


0

Staram się zminimalizować oba piksele i zaskoczyć. Zazwyczaj wolę ', aby zminimalizować piksele, ale "zamiast tego, jeśli ciąg ma apostrof, ponownie, aby zminimalizować piksele. Dla docstring jednak wolą """na '''ponieważ ten ostatni nie jest standardem, rzadkie i dlatego zaskakujące. Jeśli teraz mam kilka ciągów znaków, których użyłem "zgodnie z powyższą logiką, ale także taki, który może uciec od ', mogę nadal używać "go w celu zachowania spójności, tylko w celu zminimalizowania zaskoczenia.

Być może pomaga to myśleć o filozofii minimalizacji pikseli w następujący sposób. Czy wolałbyś, żeby angielskie znaki wyglądały A B Club AA BB CC? Ten drugi wybór marnuje 50% niepustych pikseli.


-1

Używam podwójnych cudzysłowów, ponieważ robię to od lat w większości języków (C ++, Java, VB…) oprócz Bash, ponieważ używam również podwójnych cudzysłowów w normalnym tekście i ponieważ używam (zmodyfikowanej) klawiatury innej niż angielski, gdzie oba znaki wymagają klawisza Shift.


-4

' = "

/= \=\\

przykład:

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

Wyniki są takie same

= >> nie, nie są takie same. Pojedynczy ukośnik odwróci znaki. Po prostu stało się szczęście w tym przykładzie, bo \ki \wnie jest ważne, jak ucieka \tlub \nlub \\lub\"

Jeśli chcesz używać pojedynczych ukośników odwrotnych (i należy je interpretować jako takie), musisz użyć łańcucha „raw”. Możesz to zrobić, umieszczając znak „ r” przed ciągiem

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

Jeśli chodzi o ścieżki w systemie Windows, ukośniki są interpretowane w ten sam sposób. Oczywiście sam łańcuch jest inny. Nie gwarantowałbym jednak, że są obsługiwane w ten sposób na urządzeniu zewnętrznym.


Cholera jasna, to jest stare, ale i tak chciałem skomentować, że użycie ukośników może działać w systemie Windows, ale nadal zależy od systemu. Aby upewnić się, że nie masz żadnych zależności, użyjos.path.join()
Adam Smith,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.