Как я могу получить название объекта в Python?

Я создавал сайт в Ruby on Rails, и я делал разработку локально, но развертывался к удаленной машине так часто, как я могу. Я читал в Гибкой веб-разработке с направляющими что, чем больше Вы практикуете развертывание, тем лучше, потому что, когда это прибывает время для развертывания к производству - не будет никаких неожиданностей.

29
задан Nathan Fellman 8 October 2009 в 15:29
поделиться

8 ответов

Объекты не обязательно имеют имена в python, поэтому вы не можете получить имя. Объекты нередко имеют атрибут __ name __ в тех случаях, когда у них есть имя, но это не является частью стандартного Python, и большинство встроенных типов его не имеют.

Когда вы создаете переменную, такую ​​как x, y, z выше, тогда эти имена действуют просто как «указатели» или «ссылки» на объекты. Сам объект не знает, какое имя вы используете для него, и вы не можете легко (если вообще) получить имена всех ссылок на этот объект.

Обновление: Однако функции имеют __ name __ (если это не лямбды), поэтому в этом случае вы можете сделать:

dict([(t.__name__, t) for t in fun_list])
30
ответ дан 28 November 2019 в 01:22
поделиться

Имена переменных можно найти в словарях globals () и locals (). Но они не дадут вам то, что вы ищете выше. "bla" будет содержать значение каждого элемента my_list, а не переменную.

0
ответ дан 28 November 2019 в 01:22
поделиться

Обратите внимание, что хотя, как уже отмечалось, объекты в целом не знают и не могут знать, какие переменные с ними связаны, функции, определенные с помощью def , имеют имена в Атрибут __name __ (имя, используемое в def ). Также, если функции определены в одном модуле (как в вашем примере), тогда globals () будет содержать расширенный набор словаря, который вы хотите.

def fun1:
  pass
def fun2:
  pass
def fun3:
  pass

fun_dict = {}
for f in [fun1, fun2, fun3]:
  fun_dict[f.__name__] = f
1
ответ дан 28 November 2019 в 01:22
поделиться

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

Если вы действительно хотите это сделать, вы можете использовать

def variable_for_value(value):
    for n,v in globals().items():
        if v == value:
            return n
    return None

Однако было бы лучше, если бы вы сначала перебирали имена:

my_list = ["x", "y", "z"] # x, y, z have been previously defined

for name in my_list:
    print "handling variable ", name
    bla = globals()[name]
    # do something to bla

11
ответ дан 28 November 2019 в 01:22
поделиться

Вот еще один способ подумать об этом. Предположим, существует функция name () , которая возвращает имя своего аргумента. Учитывая следующий код:

def f(a):
    return a

b = "x"
c = b
d = f(c)

e = [f(b), f(c), f(d)]

Что должен вернуть name (e [2]) и почему?

2
ответ дан 28 November 2019 в 01:22
поделиться

И я хочу иметь имя функции, потому что я хочу создать fun_dict без напишите имена функций дважды, так как это кажется хорошим способом создания ошибок.

Для этой цели у вас есть замечательная функция getattr , которая позволяет вам получить объект по известному имени. Например, вы можете сделать:

funcs.py:

def func1(): pass
def func2(): pass

main.py:

import funcs
option = command_line_option()
getattr(funcs, option)()
1
ответ дан 28 November 2019 в 01:22
поделиться

Обычно, когда вы хотите сделать что-то вроде этого, вы создаете класс для хранения всех этих функций и называете их каким-нибудь ясным префиксом cmd_ или подобным. Затем вы берете строку из команды и пытаетесь получить этот атрибут из класса с префиксом cmd_ . Теперь вам нужно только добавить в класс новую функцию / метод, и они будут доступны для ваших вызывающих абонентов. И вы можете использовать строки документа для автоматического создания текста справки.

Как описано в других ответах, вы можете использовать тот же подход с globals () и обычными функциями в вашем модуле, чтобы получить больше точно соответствует тому, что вы просили.

Примерно так:

class Tasks:
    def cmd_doit(self):
        # do it here

func_name = parse_commandline()
try:
    func = getattr('cmd_' + func_name, Tasks())
except AttributeError:
    # bad command: exit or whatever
func()
0
ответ дан 28 November 2019 в 01:22
поделиться

Используйте обратный dict.

fun_dict = {'fun1': fun1,
            'fun2': fun2,
            'fun3': fun3}

r_dict = dict(zip(fun_dict.values(), fun_dict.keys()))

Обратный dict отобразит каждую ссылку на функцию с точным именем, которое вы дали ей в fun_dict, которое может быть или не быть тем именем, которое вы использовали при определении функция. И этот метод распространяется на другие объекты, включая целые числа.

Для дополнительного удовольствия и безумия вы можете хранить прямые и обратные значения в одном и том же слове. Я бы не стал этого делать, если бы вы отображали строки в строки, но если вы делаете что-то вроде ссылок на функции и строк, это не слишком безумно.

1
ответ дан 28 November 2019 в 01:22
поделиться
Другие вопросы по тегам:

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