Cómo pasar el nombre de la variable original a una función [duplicado]

Resuelto Acorn asked hace 14 años • 13 respuestas

¿Es posible obtener el nombre de variable original de una variable pasada a una función? P.ej

foobar = "foo"

def func(var):
    print var.origname

De modo que:

func(foobar)

Devoluciones:

>>foobar

EDITAR:

Todo lo que intentaba hacer era crear una función como:

def log(soup):
    f = open(varname+'.html', 'w')
    print >>f, soup.prettify()
    f.close()

.. y hacer que la función genere el nombre del archivo a partir del nombre de la variable que se le pasa.

Supongo que si no es posible, tendré que pasar la variable y el nombre de la variable como una cadena cada vez.

Acorn avatar May 01 '10 18:05 Acorn
Aceptado

EDITAR: Para que quede claro, no recomiendo usar esto EN ABSOLUTO, se romperá, es un desastre, no te ayudará de ninguna manera, pero es factible con fines de entretenimiento/educación.

Puedes hackear el inspectmódulo, no lo recomiendo, pero puedes hacerlo...

import inspect

def foo(a, f, b):
    frame = inspect.currentframe()
    frame = inspect.getouterframes(frame)[1]
    string = inspect.getframeinfo(frame[0]).code_context[0].strip()
    args = string[string.find('(') + 1:-1].split(',')
    
    names = []
    for i in args:
        if i.find('=') != -1:
            names.append(i.split('=')[1].strip())
        
        else:
            names.append(i)
    
    print names

def main():
    e = 1
    c = 2
    foo(e, 1000, b = c)

main()

Producción:

['e', '1000', 'c']
Ivo Wetzel avatar May 01 '2010 12:05 Ivo Wetzel

Para agregar a la respuesta de Michael Mrozek , puede extraer los parámetros exactos versus el código completo mediante:

import re
import traceback

def func(var):
    stack = traceback.extract_stack()
    filename, lineno, function_name, code = stack[-2]
    vars_name = re.compile(r'\((.*?)\).*$').search(code).groups()[0]
    print vars_name
    return

foobar = "foo"

func(foobar)

# PRINTS: foobar
propjk007 avatar Oct 07 '2014 16:10 propjk007