stevenha tiene una gran respuesta a esta pregunta. Pero, si realmente no quiere hurgar en los diccionarios de espacio de nombres de todos modos, se pueden obtener todos los nombres para un valor dado en un determinado ámbito/espacio de nombres de la siguiente manera:
def foo1():
x = 5
y = 4
z = x
print names_of1(x, locals())
def names_of1(var, callers_namespace):
return [name for (name, value) in callers_namespace.iteritems() if var is value]
foo1() # prints ['x', 'z']
Si está trabajando con un pitón que tiene soporte de marco de pila (la mayoría lo hace, CPython lo hace), no es necesario que pase el dict local en la función names_of
; la función puede recuperar ese diccionario del marco de su llamador en sí:
def foo2():
xx = object()
yy = object()
zz = xx
print names_of2(xx)
def names_of2(var):
import inspect
callers_namespace = inspect.currentframe().f_back.f_locals
return [name for (name, value) in callers_namespace.iteritems() if var is value]
foo2() # ['xx', 'zz']
Si está trabajando con un tipo de valor que se puede asignar un atributo de nombre a, puede darle un nombre, y luego usar esa:
class SomeClass(object):
pass
obj = SomeClass()
obj.name = 'obj'
class NamedInt(int):
__slots__ = ['name']
x = NamedInt(321)
x.name = 'x'
por último, si usted está trabajando con los atributos de clase y usted quiere que ellos sepan sus nombres (descriptores son el caso de uso obvio), que puede hacer trucos con la programación metaclase como lo hacen en el ORM de Django y SQLAlchemy definiciones de tabla de estilo declarativo:
class AutonamingType(type):
def __init__(cls, name, bases, attrs):
for (attrname, attrvalue) in attrs.iteritems():
if getattr(attrvalue, '__autoname__', False):
attrvalue.name = attrname
super(AutonamingType,cls).__init__(name, bases, attrs)
class NamedDescriptor(object):
__autoname__ = True
name = None
def __get__(self, instance, instance_type):
return self.name
class Foo(object):
__metaclass__ = AutonamingType
bar = NamedDescriptor()
baaz = NamedDescriptor()
lilfoo = Foo()
print lilfoo.bar # prints 'bar'
print lilfoo.baaz # prints 'baaz'
¿Qué es lo que realmente no? No hay llamadas sin una 'x', por lo que puede usar print 'var x =% s'% x pero no lo hace. ¿Por qué? – tuergeist
duplicado: http://stackoverflow.com/questions/1534504/convert-variable-name-to-string –
también duplicado http://stackoverflow.com/questions/592746/how-can-you-print-a-variable -name-in-python-closed – fortran