У stevenha есть отличный ответ на этот вопрос. Но, если вы на самом деле хотите, чтобы копаться в пространстве имен словарей в любом случае, вы можете получить все имена для данного значения в определенной области/имен, как это:
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']
Если вы работаете с Python у которого есть поддержка фреймов стека (большинство делает это, CPython делает), не требуется, чтобы вы передавали locals dict в функцию names_of
; функция может извлечь этот словарь из самого кадра своего вызывающего абонента:
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']
Если вы работаете с типом значения, которые можно присвоить имя атрибута, вы можете дать ему имя, а затем использовать это:
class SomeClass(object):
pass
obj = SomeClass()
obj.name = 'obj'
class NamedInt(int):
__slots__ = ['name']
x = NamedInt(321)
x.name = 'x'
Наконец, если вы работаете с классом атрибутов, и вы хотите, чтобы они знали их имена (дескрипторы очевидного использования случай), вы можете делать классные трюки с программированием метаклассов, как они это делают в Django ORM и SQLAlchemy определения таблиц декларативного стиля:
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'
Что вы на самом деле хотите? Нет вызова без «x», поэтому вы можете использовать print «var x =% s»% x, но вы этого не делаете. Зачем? – tuergeist
duplicate: http://stackoverflow.com/questions/1534504/convert-variable-name-to-string –
дублировать слишком http://stackoverflow.com/questions/592746/how-can-you-print-a-variable -name-in-python-closed – fortran