Domanda Come si può stampare un nome di variabile in python? [duplicare]


Questa domanda ha già una risposta qui:

Dì che ho una variabile chiamata choice è uguale a 2. Come potrei accedere al nome della variabile? Qualcosa di equivalente a

In [53]: namestr(choice)
Out[53]: 'choice'

per l'uso nella creazione di un dizionario. C'è un buon modo per farlo e mi manca.

MODIFICARE:

La ragione per farlo è così. Sto eseguendo alcune analisi di dati in cui chiamo il programma con più parametri che vorrei modificare, o non modificare, in fase di esecuzione. Ho letto i parametri che ho usato nell'ultima esecuzione da un file .config formattato come

filename
no_sig_resonance.dat

mass_peak
700

choice
1,2,3

Quando richiesto per i valori, viene visualizzato il precedente utilizzato e un input di stringa vuota utilizzerà il valore utilizzato in precedenza.

La mia domanda si verifica perché quando si tratta di scrivere nel dizionario che questi valori sono stati scansionati. Se è necessario un parametro, corro get_param che accede al file e trova il parametro.

Penso che eviterò il problema tutti insieme leggendo il.config file una volta e producendo un dizionario da quello. L'ho evitato originariamente per ... ragioni che non ricordo più. Situazione perfetta per aggiornare il mio codice!


46
2018-02-26 22:26


origine


risposte:


Se insisti, ecco una soluzione orribile basata sull'ispezione.

import inspect, re

def varname(p):
  for line in inspect.getframeinfo(inspect.currentframe().f_back)[3]:
    m = re.search(r'\bvarname\s*\(\s*([A-Za-z_][A-Za-z0-9_]*)\s*\)', line)
    if m:
      return m.group(1)

if __name__ == '__main__':
  spam = 42
  print varname(spam)

Spero che ti ispiri a rivalutare il problema che hai e cercare un altro approccio.


76
2018-02-26 23:05



Per rispondere alla tua domanda originale:

def namestr(obj, namespace):
    return [name for name in namespace if namespace[name] is obj]

Esempio:

>>> a = 'some var'
>>> namestr(a, globals())
['a']

Come @rbright ha già sottolineato qualunque cosa tu faccia ci sono probabilmente modi migliori per farlo.


46
2018-02-26 23:14



Non puoi, poiché non ci sono variabili in Python ma solo nomi.

Per esempio:

> a = [1,2,3]
> b = a
> a is b
True

Quale di questi due è ora la variabile corretta? Non c'è differenza tra a e b.

C'è stato un domanda simile prima.


13
2018-02-26 22:31



Se stai provando a farlo, significa che stai facendo qualcosa di sbagliato. Considerare l'utilizzo di a dict anziché.

def show_val(vals, name):
    print "Name:", name, "val:", vals[name]

vals = {'a': 1, 'b': 2}
show_val(vals, 'b')

Produzione:

Name: b val: 2

9
2018-02-26 22:52



Piuttosto che chiedere dettagli per una soluzione specifica, ti consiglio di descrivere il problema che affronti; Penso che otterrai risposte migliori. Dico questo perché c'è quasi sicuramente un modo migliore per fare qualunque cosa tu stia cercando di fare. L'accesso ai nomi delle variabili in questo modo non è comunemente necessario per risolvere problemi in qualsiasi lingua.

Detto questo, tutti i nomi delle variabili sono già nei dizionari che sono accessibili tramite le funzioni integrate gente del posto e globali. Utilizzare quello corretto per l'ambito che si sta ispezionando.

Uno dei pochi idiomi comuni per l'ispezione di questi dizionari è per una facile interpolazione delle stringhe:

>>> first = 'John'
>>> last = 'Doe'
>>> print '%(first)s %(last)s' % globals()
John Doe

Questo tipo di cose tende ad essere un po 'più leggibile rispetto alle alternative, anche se richiede l'ispezione di variabili per nome.


6
2018-02-26 22:49



Qualcosa come questo lavoro per te?

>>> def namestr(**kwargs):
...     for k,v in kwargs.items():
...       print "%s = %s" % (k, repr(v))
...
>>> namestr(a=1, b=2)
a = 1
b = 2

E nel tuo esempio:

>>> choice = {'key': 24; 'data': None}
>>> namestr(choice=choice)
choice = {'data': None, 'key': 24}
>>> printvars(**globals())
__builtins__ = <module '__builtin__' (built-in)>
__name__ = '__main__'
__doc__ = None
namestr = <function namestr at 0xb7d8ec34>
choice = {'data': None, 'key': 24}

2
2018-02-26 23:01



Per la revisione della domanda su come leggere i parametri di configurazione, ti consiglio vivamente di risparmiare tempo, fatica e utilizzo ConfigParser o (il mio strumento preferito) ConfigObj.

Possono fare tutto ciò di cui hai bisogno, sono facili da usare e qualcun altro si è già preoccupato di come farli funzionare correttamente!


2
2018-02-26 23:39



Con una valutazione entusiasta, le variabili si trasformano essenzialmente nei loro valori ogni volta che le guardi (per parafrasare). Detto questo, Python ha built-in spazi dei nomi. Ad esempio, i locals () restituiranno un dizionario che associa i nomi di variabili di una funzione ai loro valori, e globals () fa lo stesso per un modulo. Così:

for name, value in globals().items():
    if value is unknown_variable:
        ... do something with name

Si noti che non è necessario importare nulla per poter accedere a locals () e globals ().

Inoltre, se esistono più alias per un valore, l'iterazione attraverso uno spazio dei nomi trova solo il primo.


2
2018-02-26 22:45