Cómo pasar el nombre de la variable original a una función [duplicado]
¿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.
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 inspect
mó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']
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