Как я получаю строковое представление переменной в Python?

Я немного запутался, поэтому извините, если я ошибаюсь, но вы хотите определить n-й корень чисел в каждой строке матрицы, где n = номер строки. Если это так, то действительно просто создать новый массив с теми же размерами, что и у оригинала, с каждым столбцом, имеющим те же значения, что и соответствующий номер строки:

test_row_order = array(seq(1:length(test[,1]), dim = dim(test))

Затем просто примените функцию (n корень в этом случае):

n_root = test^(1/test_row_order)
6
задан Johan 3 November 2009 в 07:49
поделиться

4 ответа

В: У меня есть переменная x в python. Как мне найти строку «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 является «правильным»? Все они относятся к одному и тому же объекту.

PS Вышесказанное является несколько отредактированной версией ответа, который я написал ранее. Думаю, на этот раз я лучше сформулировал текст.

и baz - это "правильный" ответ? Все они относятся к одному и тому же объекту.

PS Вышесказанное является несколько отредактированной версией ответа, который я написал ранее. Думаю, на этот раз я лучше сформулировал текст.

и baz - это "правильный" ответ? Все они относятся к одному и тому же объекту.

PS Вышесказанное является несколько отредактированной версией ответа, который я написал ранее. Думаю, на этот раз я лучше сформулировал текст.

13
ответ дан 8 December 2019 в 04:53
поделиться

Стивенха дает отличный ответ на этот вопрос. Но, если вы действительно хотите покопаться в словарях пространств имен, вы можете получить все имена для данного значения в определенной области / пространстве имен следующим образом:

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']

Если вы работаете с типом значения, которому вы можете присвоить атрибут name, вы можете дать ему имя, а затем использовать его:

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'
3
ответ дан 8 December 2019 в 04:53
поделиться

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

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

2: repr ()

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

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

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

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

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

Кроме того, реализация по умолчанию .__ str __ () заключается в вызове .__ repr __ () , поэтому, если класс не имеет собственных переопределений для .__ str __ () , используется значение, возвращенное из .__ repr __ () .

1
ответ дан 8 December 2019 в 04:53
поделиться

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

в отношении объекта. to __ repr __ () :

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

См. документацию здесь: объект. repr (self)

7
ответ дан 8 December 2019 в 04:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: