Virgolette singole vs. virgolette doppie in Python [chiuso]


718

Secondo la documentazione, sono praticamente intercambiabili. C'è un motivo stilistico da usare l'uno sull'altro?

Risposte:


525

Mi piace usare le virgolette doppie attorno alle stringhe utilizzate per l'interpolazione o che sono messaggi in linguaggio naturale e le virgolette singole per stringhe simili a simboli piccoli, ma infrangerò le regole se le stringhe contengono virgolette o se dimentico. Uso le doppie virgolette doppie per i docstring e i letterali di stringa grezzi per le espressioni regolari anche se non sono necessarie.

Per esempio:

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
Interessante, li uso esattamente allo stesso modo. Non ricordo di aver mai letto nulla che mi spingesse in quella direzione. Uso anche le virgolette singole triple per la stringa lunga non destinata agli umani, come HTML grezzo. Forse ha a che fare con le regole di citazione in inglese.
Mike,

12
La maggior parte dei programmatori Python lo codifica in questo modo. Non esiste una regola esplicita, ma poiché spesso leggiamo il codice in questo modo, diventa un'abitudine.
e-satis

Mi chiedo se le singole virgolette per cose simili a simboli provengano effettivamente dalla scorciatoia dell'espressione delle virgolette in Lisp / Scheme. In ogni caso, è intuitivo. Inoltre, amico mio, se stiamo seguendo le linee guida di stile PEP 8, le funzioni dovrebbero davvero essere chiamate lights_message () e is_pirate ().
yukondude,

8
Penso che Perl abbia fatto una distinzione tra stringhe tra virgolette singole (nessuna interpolazione) e stringhe tra virgolette doppie (con interpolazione) e che i programmatori Python avrebbero potuto ereditare l'abitudine o non lasciarla mai andare.
Daren Thomas,

2
Uso la stessa convenzione, inoltre lo abuso avendo vim evidenziare tutto all'interno di triple virgolette singole come SQL.
RoundTower

96

Citando i documenti ufficiali su https://docs.python.org/2.0/ref/strings.html :

In parole povere: i letterali di stringa possono essere racchiusi tra virgolette singole (') o doppie (").

Quindi non c'è differenza. Invece, le persone ti diranno di scegliere qualsiasi stile che corrisponda al contesto e di essere coerente . E sarei d'accordo - aggiungendo che è inutile cercare di trovare "convenzioni" per questo genere di cose perché finirai solo per confondere i nuovi arrivati.


3
sì, per me la coerenza è la chiave, quindi uso i single ovunque. Meno tasti premuti, inequivocabili e coerenti.
mlissner,

90

Preferivo ', soprattutto per '''docstrings''', come trovo """this creates some fluff""". Inoltre, 'può essere digitato senza il Shifttasto sulla mia tastiera svizzera tedesca.

Da allora sono passato all'utilizzo delle virgolette triple per """docstrings""", in conformità con PEP 257 .


2
Tendo a preferire le virgolette singole, poiché scrivo codice SQL ogni giorno e le virgolette singole vengono utilizzate per valori letterali di stringa in T-SQL. Ma io uso triple virgolette doppie, perché a volte i docstring possono usare un po 'di lanugine.
eksortso,

4
L'uso ovunque delle virgolette semplici per le stringhe mi permette di disabilitare parti del codice sorgente usando tre virgolette doppie - tipo di '#if 0' e '#endif'.
dim

12
"richiede un tasto Maiusc solo su una tastiera QWERTY per PC. Sulla mia tastiera, in "realtà è più facile da scrivere.
e-satis,

6
sul mio keybord "e 'entrambi richiedono il tasto shift.
Loïc Faure-Lacroix

10
Questa risposta è contraria alla convenzione di Python; vedi PEP 257 che dice: Per coerenza, usa sempre "" "virgolette doppie" "" attorno alle stringhe. python.org/dev/peps/pep-0257
Buttons840

44

Sono con Will:

  • Virgolette doppie per il testo
  • Virgolette singole per tutto ciò che si comporta come un identificatore
  • Letterali stringa grezzi tra virgolette doppie per regexps
  • Virgolette doppie triplicate per dotstrings

Rimarrò fedele anche se ciò significa scappare molto.

Ottengo il massimo valore dai singoli identificatori tra virgolette che si distinguono per le virgolette. Il resto delle pratiche sono lì solo per dare un po 'di spazio a quegli identificatori con virgolette singole.


26

Se la stringa che hai ne contiene una, allora dovresti usare l'altra. Ad esempio "You're able to do this", o 'He said "Hi!"'. A parte questo, dovresti semplicemente essere il più coerente possibile (all'interno di un modulo, all'interno di un pacchetto, all'interno di un progetto, all'interno di un'organizzazione).

Se il codice verrà letto da persone che lavorano con C / C ++ (o se si passa tra quelle lingue e Python), l'utilizzo ''di stringhe a carattere singolo e ""stringhe più lunghe potrebbe facilitare la transizione. (Allo stesso modo per seguire altre lingue in cui non sono intercambiabili).

Il codice Python che ho visto in natura tende a favorire "sopra ', ma solo leggermente. L'unica eccezione è che """these"""sono molto più comuni di'''these''' , da quello che ho visto.


21

I commenti tra virgolette sono un argomento secondario interessante di questa domanda. PEP 257 specifica le virgolette triple per le stringhe di documenti . Ho fatto un rapido controllo usando Ricerca codice Google e ho scoperto che le doppie virgolette doppie in Python sono circa 10 volte più popolari delle virgolette singole triple - occorrenze 1,3 M vs 131 K negli indici Google del codice. Quindi, nel caso di più righe, probabilmente il tuo codice sarà più familiare alle persone se utilizza virgolette doppie triple.


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

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

Per questo semplice motivo, uso sempre doppie virgolette all'esterno. Sempre

A proposito di lanugine, a che serve razionalizzare i letterali delle stringhe con 'se devi usare i caratteri di escape per rappresentare gli apostrofi? Offende ai programmatori leggere romanzi? Non riesco a immaginare quanto sia stata dolorosa la lezione di inglese al liceo per te!


11
'Se hai intenzione di "citare" qualcosa che vorrai sicuramente usare virgolette singole'
Paolo,

La mia opinione è molto cambiata da quando l'ho scritta. Ora è solo una specie di situazione in cui direi che avrei usato le virgolette doppie. Un altro sarebbe tuo nel contesto dell'utilizzo di virgolette singole. Vedi la risposta accettata per la mia attuale posizione in materia in modo più dettagliato. Penso che sia un ottimo esempio di come dovrebbe essere presentato a un vasto pubblico.
Droogans,

7

Python usa le virgolette in questo modo:

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

Che dà il seguente risultato:

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
Ma """This is a string with "quotes""""genera un SyntaxError. Come è possibile risolvere questa situazione? (come con '''This is a string with 'quotes'''')
dolma33

1
Inserisci una interruzione di riga tra "virgolette" e "" "
Nicolas,

1
@ dolma33 Il suggerimento di Nicolas cambierebbe il contenuto della stringa. Una soluzione migliore è già nella risposta: se la stringa termina con un tipo di virgoletta, utilizza l' altro tipo di virgoletta tripla. Ad es '''This is a string with "quotes"'''.
jpmc26

3

Uso le doppie virgolette in generale, ma non per alcun motivo specifico - Probabilmente solo per abitudine da Java.

Immagino che anche tu abbia più probabilità di volere apostrofi in una stringa letterale in linea di quanto tu voglia desiderare virgolette doppie.


3

Personalmente rimango con l'uno o l'altro. Non importa E fornire il proprio significato a entrambe le citazioni è solo confondere le altre persone quando si collabora.


2

Probabilmente è una preferenza stilistica più di ogni altra cosa. Ho appena controllato PEP 8 e non ho visto alcuna menzione di virgolette singole o doppie.

Preferisco le virgolette singole perché è solo una sequenza di tasti anziché due. Cioè, non devo schiacciare il tasto Maiusc per fare una singola citazione.


1
PEP 8 si collega a PEP 257 nella prima frase sotto "Stringhe di documentazione". Nel PEP 257 afferma: Per coerenza, usa sempre "" "virgolette doppie" "" attorno alle stringhe. Utilizzare r "" "virgolette doppie triple" "" se si utilizzano barre rovesciate nelle dotstring. Per le stringhe Unicode, usa u "" "Stringhe a tripla virgola Unicode" "". Tuttavia, mi piace l'aspetto pulito di una singola citazione e l'unica ragione per cui hai dato.
maxpolk,

2

In Perl vuoi usare virgolette singole quando hai una stringa che non ha bisogno di interpolare variabili o caratteri di escape come \ n, \ t, \ r, ecc.

PHP fa la stessa distinzione di Perl: il contenuto tra virgolette singole non verrà interpretato (nemmeno \ n verrà convertito), al contrario delle virgolette doppie che possono contenere variabili per la stampa del loro valore.

Python no, temo. Tecnicamente visto, non c'è $ token (o simili) per separare un nome / testo da una variabile in Python. Entrambe le funzionalità rendono Python più leggibile, meno confuso, dopo tutto. Le virgolette singole e doppie possono essere usate in modo intercambiabile in Python.


Per rafforzare ciò che dici \ n verrà interpretato solo tra virgolette doppie in PHP e Perl, mentre in Python funzionerà sia tra virgolette doppie che singole
stivlo

1
@stivlo: a meno che non si crei una stringa grezza da essa, aggiungendo rletteralmente davanti alla stringa. Quindi print 'a\nb'ti stamperà due righe, ma print r'a\nb'ti stamperà una.
Tadeck,

1

Ho scelto di usare le virgolette doppie perché sono più facili da vedere.


1

Uso solo ciò che colpisce la mia fantasia in quel momento; è conveniente poter passare da un capriccio all'altro!

Naturalmente, quando si citano i caratteri di citazione, il passaggio tra i due potrebbe non essere così stravagante dopo tutto ...


0

Il gusto del tuo team o le linee guida per la codifica del tuo progetto.

Se ti trovi in ​​un ambiente multilingue, potresti voler incoraggiare l'uso dello stesso tipo di virgolette per le stringhe utilizzate dall'altra lingua, ad esempio. Altrimenti, mi piace di più l'aspetto di "


0

Nessuno per quanto ne so. Sebbene se guardi un po 'di codice, "" è comunemente usato per stringhe di testo (suppongo che' sia più comune all'interno del testo di "), e '' appare negli hashkey e cose del genere.


0

Ho l'obiettivo di ridurre al minimo sia i pixel che la sorpresa. In genere preferisco 'minimizzare i pixel, ma "invece se la stringa ha un apostrofo, di nuovo per minimizzare i pixel. Per un docstring, tuttavia, preferisco """rispetto a '''quest'ultimo perché è non standard, non comune e quindi sorprendente. Se ora ho un sacco di stringhe in cui ho usato "per la logica di cui sopra, ma anche una che può cavarsela con un ', potrei ancora usare" per preservare la coerenza, solo per minimizzare la sorpresa.

Forse aiuta a pensare alla filosofia della minimizzazione dei pixel nel modo seguente. Preferiresti che i personaggi inglesi fossero simili A B Co AA BB CC? Quest'ultima scelta spreca il 50% dei pixel non vuoti.


-1

Uso le virgolette doppie perché lo faccio da anni nella maggior parte delle lingue (C ++, Java, VB ...) tranne Bash, perché utilizzo anche virgolette doppie nel testo normale e perché sto usando una tastiera non inglese (modificata) in cui entrambi i caratteri richiedono il tasto Maiusc.


-4

' = "

/= \=\\

esempio :

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

I risultati sono gli stessi

= >> no, non sono gli stessi. Una singola barra inversa sfuggirà ai personaggi. Ti capita di essere fortunato in questo esempio perché \ke \wnon sono fughe valide come \to \no \\o\"

Se si desidera utilizzare singole barre rovesciate (e interpretarle come tali), è necessario utilizzare una stringa "non elaborata". Puoi farlo mettendo un ' r' davanti alla stringa

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

Per quanto riguarda i percorsi in Windows, le barre in avanti vengono interpretate allo stesso modo. Chiaramente la stringa stessa è diversa però. Non garantirei che vengano gestiti in questo modo su un dispositivo esterno.


Questa merda è vecchia, ma volevo comunque commentare per sottolineare che l'uso di barre rovesciate può funzionare per Windows ma è ancora dipendente dal sistema. Per essere sicuro delle dipendenze del sistema operativo, utilizzareos.path.join()
Adam Smith il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.