Я создавал сайт в Ruby on Rails, и я делал разработку локально, но развертывался к удаленной машине так часто, как я могу. Я читал в Гибкой веб-разработке с направляющими что, чем больше Вы практикуете развертывание, тем лучше, потому что, когда это прибывает время для развертывания к производству - не будет никаких неожиданностей.
Объекты не обязательно имеют имена в python, поэтому вы не можете получить имя.
Объекты нередко имеют атрибут __ name __
в тех случаях, когда у них есть имя, но это не является частью стандартного Python, и большинство встроенных типов его не имеют.
Когда вы создаете переменную, такую как x, y, z выше, тогда эти имена действуют просто как «указатели» или «ссылки» на объекты. Сам объект не знает, какое имя вы используете для него, и вы не можете легко (если вообще) получить имена всех ссылок на этот объект.
Обновление: Однако функции имеют __ name __
(если это не лямбды), поэтому в этом случае вы можете сделать:
dict([(t.__name__, t) for t in fun_list])
Имена переменных можно найти в словарях globals () и locals (). Но они не дадут вам то, что вы ищете выше. "bla" будет содержать значение каждого элемента my_list, а не переменную.
Обратите внимание, что хотя, как уже отмечалось, объекты в целом не знают и не могут знать, какие переменные с ними связаны, функции, определенные с помощью 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
На самом деле это невозможно, так как может быть несколько переменных, которые имеют одинаковое значение, или значение может не иметь переменной, или значение может иметь то же значение, что и переменная, только случайно.
Если вы действительно хотите это сделать, вы можете использовать
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
Вот еще один способ подумать об этом. Предположим, существует функция name ()
, которая возвращает имя своего аргумента. Учитывая следующий код:
def f(a):
return a
b = "x"
c = b
d = f(c)
e = [f(b), f(c), f(d)]
Что должен вернуть name (e [2])
и почему?
И я хочу иметь имя функции, потому что я хочу создать
fun_dict
без напишите имена функций дважды, так как это кажется хорошим способом создания ошибок.
Для этой цели у вас есть замечательная функция getattr
, которая позволяет вам получить объект по известному имени. Например, вы можете сделать:
funcs.py:
def func1(): pass
def func2(): pass
main.py:
import funcs
option = command_line_option()
getattr(funcs, option)()
Обычно, когда вы хотите сделать что-то вроде этого, вы создаете класс для хранения всех этих функций и называете их каким-нибудь ясным префиксом 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()
Используйте обратный dict.
fun_dict = {'fun1': fun1,
'fun2': fun2,
'fun3': fun3}
r_dict = dict(zip(fun_dict.values(), fun_dict.keys()))
Обратный dict отобразит каждую ссылку на функцию с точным именем, которое вы дали ей в fun_dict, которое может быть или не быть тем именем, которое вы использовали при определении функция. И этот метод распространяется на другие объекты, включая целые числа.
Для дополнительного удовольствия и безумия вы можете хранить прямые и обратные значения в одном и том же слове. Я бы не стал этого делать, если бы вы отображали строки в строки, но если вы делаете что-то вроде ссылок на функции и строк, это не слишком безумно.