2009-11-03 6 views
6

У меня есть переменная x в python. Как я могу найти строку «x» из переменной. Вот моя попытка:Как получить строковое представление переменной в python?

def var(v,c): 
    for key in c.keys(): 
    if c[key] == v: 
     return key 


def f(): 
    x = '321' 
    print 'Local var %s = %s'%(var(x,locals()),x) 

x = '123' 
print 'Global var %s = %s'%(var(x,locals()),x) 
f() 

Результаты:

Global var x = 123 
Local var x = 321 

выше рецепт кажется немного не по-pythonesque. Есть ли лучший/более короткий способ добиться того же результата?

+2

Что вы на самом деле хотите? Нет вызова без «x», поэтому вы можете использовать print «var x =% s»% x, но вы этого не делаете. Зачем? – tuergeist

+0

duplicate: http://stackoverflow.com/questions/1534504/convert-variable-name-to-string –

+0

дублировать слишком http://stackoverflow.com/questions/592746/how-can-you-print-a-variable -name-in-python-closed – fortran

ответ

13

Q: У меня есть переменная х в питона. Как я могу найти строку «x» из переменной.

A: Если я правильно понимаю ваш вопрос, вы хотите перейти от значения переменной к ее имени. В Python это не реально.

В Python действительно нет такой вещи, как «переменная». У Python действительно есть «имена», которые могут иметь связанные с ними объекты. Для объекта не имеет значения, какие имена, если таковые имеются, могут быть связаны. Это может быть связано с десятками разных имен или нет.

Рассмотрим следующий пример:

foo = 1 
bar = foo 
baz = foo 

Теперь предположим, что у вас есть целое объект со значением 1, и вы хотите работать в обратном направлении и найти свое имя. Что бы вы напечатали? Три разных имени имеют связанный с ними объект, и все они одинаково действительны.

print(bar is foo) # prints True 
print(baz is foo) # prints True 

В Python, имя это способ получить доступ к объекту, так что нет никакого способа, чтобы работать с именами напрямую. Возможно, вам удастся найти locals(), чтобы найти значение и восстановить имя, но это, в лучшем случае, трюк. И в моем примере выше, который из foo, bar и baz является «правильным» ответом? Все они относятся к одному и тому же объекту.

P.S. Вышеупомянутая несколько отредактированная версия an answer I wrote before. Я думаю, что на этот раз я лучше сделал формулировку.

+0

Да, это возможно с помощью функции locals(). Он возвращает словарь всех переменных в локальной области (включая объекты, методы и функции). – elzapp

+0

Спасибо за ответ. Я увлекся на другом треке. Ваш предыдущий пост изменил мой взгляд на то, что я хотел сделать. – Johan

7

Я считаю, что общая форма того, что вы хотите, это repr() или метод __repr__() объекта.

касаемо __repr__():

Called по предст() встроенные функции и строковых преобразования (обратный кавычки), чтобы вычислить «официальное» строкового представления объекта.

Смотрите документы здесь: object.repr(self)

+0

Да, это моя интерпретация вопроса OPs также. Вы можете использовать функцию repr() для представления python-оператора объекта, str() для строкового представления ascii и unicode() для строкового представления Unicode. – btk

0

Есть три способа, чтобы получить "" строковое представление объекта в Python: 1: ул()

>>> foo={"a":"z","b":"y"} 
>>> str(foo) 
"{'a': 'z', 'b': 'y'}" 

2: магнезии()

>>> foo={"a":"z","b":"y"} 
>>> repr(foo) 
"{'a': 'z', 'b': 'y'}" 

3: строка интерполяции :

>>> foo={"a":"z","b":"y"} 
>>> "%s" % (foo,) 
"{'a': 'z', 'b': 'y'}" 

В этом случае все три метода сгенерировали один и тот же выход, di Преимуществом является то, что str() вызывает dict.__str__(), а функция repr() вызывает dict.__repr__(). str() используется для интерполяции строк, а функция repr() используется Python внутри каждого объекта в списке или dict при печати списка или dict.

Как упоминалось выше упоминание Тендайи Мауше, строка, созданная репрезентацией, не обязательно удобочитаема для человека.

3

У 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' 
Смежные вопросы