2009-03-11 15 views
155

Attualmente sto lavorando su un calcolo in shell python. Quello che voglio è la lista in stile Matlab in cui puoi vedere tutte le variabili che sono state definite fino ad un punto (quindi so quali nomi ho usato, i loro valori e così via).Visualizzazione di tutte le variabili definite

C'è un modo e come posso farlo?

+0

Sto dimensionando alcune strutture secondo le regole di una società di classificazione. Quindi tutti gli spessori sono t, lunghezze L ecc. E a volte si chiamano a vicenda, quindi il t usato nel cap.7.2.4. utilizza t da 3.2.2. È un calcolo una tantum, quindi uso py come shell interattiva. – Rook

+2

fatto e fatto: http://stackoverflow.com/questions/430811/enumerate-or-list-all-variables-in-un-program-of-your-favorite-language-here – Kurt

risposta

24

per ottenere i nomi:

for name in vars().keys(): 
    print(name) 

per ottenere i valori:

for value in vars().values(): 
    print(value) 

Vars() prende anche un argomento opzionale per scoprire quali vars sono definiti all'interno di un oggetto in sé.

10

stampa locals()

modifica continua dal commento.

per farlo sembrare un po 'più bella durante la stampa:

import sys, pprint 
sys.displayhook = pprint.pprint 
locals() 

Che dovrebbe darvi una stampa più verticale.

+0

Ciao. Questo potrebbe funzionare. C'è un modo per farlo stampare in modo relativamente "verticale". Basta svuotarlo uno dopo l'altro non è molto utile, soprattutto quando si hanno circa 300 variabili. – Rook

+0

Certo, prova questo: import sys, pprint sys.displayhook = pprint.pprint locals() – Harold

+0

oops, che non è stato formattato troppo bene. Lo aggiungerò alla mia risposta. – Harold

209

paio di cose che potrebbe usare:

  • dir() vi darà l'elenco delle variabili di ambito:
  • globals() vi darà un dizionario di variabili globali
  • locals() vi darà un dizionario di variabili locali
2

globals(), locals(), vars() e dir() possono essere di aiuto in ciò che si desidera.

9

tenere presente dir() restituirà tutte le importazioni correnti, E variabili.

se si desidera solo le variabili, vorrei suggerire uno schema di denominazione che è facile da estrarre da dir, come ad esempio varScore, varNames, ecc

in questo modo, si può semplicemente fare questo:

for vars in dir(): 
if vars.startswith("var"): 
    print vars 

Modifica

se si desidera elencare tutte le variabili, ma esclude moduli importati e variabili quali:

__builtins__ 

si può usare qualcosa in questo modo:

import os 
import re 

x = 11 
imports = "os","re" 

for vars in dir(): 
    if vars.startswith("__") == 0 and vars not in imports: 
     print vars 

come si può vedere, mostrerà le "importazioni" variabili, però, perché è una variabile (o meglio, una tupla). Una soluzione rapida consiste nell'aggiungere la parola "importazioni" nella tupla delle importazioni stessa!

+1

Uhmm, no, non sarà possibile, ho paura. Molti di loro sono solo t, a, c, d, L, p ... e così via. – Rook

+1

Ah, un piccolo progetto che sta cercando di indovinare? Sarei impazzito a realizzare grandi progetti usando variabili a carattere singolo, una volta arrivato a 1k + LOC e devi ricordare cosa contiene ciascuna variabile ... diventa frustrante. –

+0

La mia ipotesi sarà circa 300 pg di report, quindi questo rende circa 2000 variabili (spessore di questo, spessore di quello, spessore di qualcosa che non so nemmeno cosa sia .... :) ... sì lo fa. – Rook

112

Se questa è un'opzione per voi, si potrebbe desiderare di guardare IPython:

Per ottenere un elenco di tutte le variabili attualmente definite, Tipo who:

In [1]: foo = 'bar' 

In [2]: who 
foo 

è possibile digitare whos per più dettagli:

In [3]: whos 
Variable Type Data/Info 
---------------------------- 
foo  str  bar 

Ci sono molte altre funzioni disponibili: in pratica è l'interprete Python su st eroids. Un uno conveniente è store comando, che permette di salvare le variabili tra le sessioni (un po 'come un super facile pickle)

Se si dispone di pochi minuti, controlla Jeff Rush's excellent IPython demonstration screencasts:

Io sono in alcun modo associato con la squadra dietro a IPython, solo un utente soddisfatto.

+9

+1, ma vorrei poter votare +10:% di IPython che rimuove le variabili non utente dai locals()! – EOL

+5

Questa risposta è semi-utile, dal momento che se qualcuno non conosce bene IPython, non saprà che è necessario attivare l'automagic per far funzionare i comandi. Di default, hanno bisogno di prefigurare i comandi magici con%, ad es. '% Who' –

1
def MyWho(): 
    print [v for v in globals().keys() if not v.startswith('_')] 

Questo deve essere definito nella shell interattiva.

import os, a = 10, import sys, MyWho() poi dà

[ 'a', 'MyWho', 'sys', 'os']

3

un po 'più intelligente (pitone 3) modo:

def printvars(): 

    tmp = globals().copy() 
    [print(k,' : ',v,' type:' , type(v)) for k,v in tmp.items() if not k.startswith('_') and k!='tmp' and k!='In' and k!='Out' and not hasattr(v, '__call__')] 
3

nel mio Python 2.7 interprete, lo stesso whos comando che esiste in MATLAB esiste in Python. Mostra gli stessi dettagli dell'analogo MATLAB (nome della variabile, tipo e valore/dati).

Nell'interprete Python, whos elenca tutte le variabili nel "spazio dei nomi interattivo".

28

Come RedBlueThing analogico e ha detto:

  • dir() dà una lista di variabili scope
  • globals() dà un dizionario di variabili globali
  • locals() dà un dizionario delle variabili locali

Utilizzo della shell interattiva (versione 2.6.9), dopo aver creato le variabili a = 1 e b = 2, in esecuzione dir()

['__builtins__', '__doc__', '__name__', '__package__', 'a', 'b'] 

esecuzione locals()

{'a': 1, 'b': 2, '__builtins__': <module '__builtin__' (built-in)>, '__package__': None, '__name__': '__main__', '__doc__': None} 

Esecuzione globals() dà esattamente la stessa risposta locals() in questo caso.

Non ho ottenuto alcun modulo, quindi tutte le variabili sono disponibili come variabili locali e globali.locals() e globals() elencano i valori delle variabili nonché i nomi; dir() elenca solo i nomi.

Se importo un modulo ed eseguo locals() o globals() all'interno del modulo, dir() restituisce ancora solo un piccolo numero di variabili; aggiunge __file__ alle variabili elencate sopra. locals() e globals() elencano anche le stesse variabili, ma nel processo di stampa del valore di dizionario per __builtin__, elenca un numero molto più grande di variabili: funzioni integrate, eccezioni e tipi come "'type': <type 'type'>", anziché solo il breve <module '__builtin__' (built-in)> come mostrato sopra.

Per ulteriori informazioni su dir(), vedere Python 2.7 quick reference presso New Mexico Tech o the dir() function su ibiblio.org.

Per maggiori informazioni su locals() e globals() vedere locals and globals al Dive Into Python e una pagina su globals presso la New Mexico Tech.

[Commento: @Kurt: hai fornito un collegamento a enumerate-or-list-all-variables-in-a-program-of-your-favorite-language-here ma la risposta ha un errore. Il problema è: type(name) nell'esempio restituirà sempre <type 'str'>. Ottieni una lista delle variabili, che risponde alla domanda, ma con i tipi errati elencati accanto a loro. Questo non era ovvio nel tuo esempio perché tutte le variabili erano comunque stringhe; tuttavia, ciò che restituisce è il tipo di nome della variabile anziché il tipo della variabile. Per risolvere questo problema: invece di print type(name) utilizzare print eval('type(' + name + ')'). Mi scuso per aver postato un commento nella sezione di risposta, ma non ho i privilegi di postare commenti e l'altra domanda è chiusa.]

Problemi correlati