2012-01-30 10 views
6

Sto imparando Python e sto leggendo attraverso uno script di esempio che include alcune definizioni di variabili che sembrano:Cosa significa var, _ = qualcosa in Python? Concatenazione di stringhe?

output,_ = call_command('git status') 
output,_ = call_command('pwd') 

def call_command(command): 
    process = subprocess.Popen(command.split(' '), 
     stdout=subprocess.PIPE, 
     stderr=subprocess.PIPE) 
    return process.communicate() 

se stampo uscita I ottenere l'output della shell risultante legati insieme, quindi so che è concatenare le variabili. Ma non riesco a trovare alcun riferimento alla convenzione, in nessuno dei documenti. Qualcuno può spiegarmelo in modo tale che so per certo che lo sto usando correttamente?

+0

"definizioni delle variabili"? Non vi è nulla di simile. Sono solo dichiarazioni di assegnazione. –

+1

Un modo più chiaro per scrivere la dichiarazione, assumendo '_' era inutilizzata, sarebbe' uscita = call_command ('pwd') [0] ' – gahooa

risposta

13

La forma generale

a, b = x, y 

è assegnazione tupla. Le parti corrispondenti sono assegnati, la suddetta è equivalente a:

a = x 
b = y 

Nel suo caso, call_command() restituisce una tupla di due elementi (che è quello che process.communicate() ritorni). Stai assegnando il primo a output e il secondo a _ (che in realtà è un nome di variabile, in genere utilizzato per indicare un nome quando non ti interessa il valore).

+3

Si noti che il nome della variabile _ è di solito usato come un nome "fittizio" per indicare variabili inutilizzate. – GaretJax

+0

Essa ha anche un altro significato in sessioni di interpretariato: * ultimo valore valutato * – Droogans

4

Ci sono due convenzioni qui:

  • Disimballare risultati in una tupla di due elementi (,)
  • non mi interessa circa il secondo elemento della tupla in modo da utilizzare _ come il nome di quel variabile.

In questo caso particolare, process.communicate rendimenti (stdout, stderr), ma il codice che chiama call_command non è interessato a stderr in modo che utilizza questa notazione per ottenere stdout direttamente. Questo sarebbe più o meno equivalente a:

result = call_command(<command>) 
stdout = result[0] 
3

_ è un nome di variabile valido in Python che viene in genere utilizzato quando non si intende utilizzare un risultato per qualcosa. Quindi stai disimballando i risultati dei comandi git in due variabili denominate output e _, ma non utilizzerò il secondo (presumo che sia stato di uscita o forse output di errore standard).

0

No, non è concatenazione di stringhe. Il _ in sé e per sé non significa nulla in Python.

In Python, una funzione può restituire più di un valore ed è possibile assegnare a più di una variabile in un'istruzione. La combinazione di queste due caratteristiche permette di scrivere codice come:

def foo(): 
    return 1, 2, 3 

a, b, c = foo() 
print(a) # prints 1 
print(b) # prints 2 
print(c) # prints 3 

C'è una convenzione comune nelle lingue che sostengono che lavorano con più valori come questo che nominare uno _ significa "Non mi importa davvero di ciò che finisce in questo variabile." Nell'esempio, la funzione call_command restituisce ciò che il comando scrive sullo standard output nel suo primo valore restituito e ciò che viene scritto sull'errore standard nel secondo. Chiunque abbia codificato quello apparentemente non si è preoccupato degli errori riportati dai comandi.

La concatenazione di uscita citata deve avvenire altrove.