Создать словарь из списка переменных
Я ищу способ создания словаря без явного написания ключа
Я хочу создать функцию, которая получает числовые переменные, и создать словарь, где имена переменных являются ключами, а их значением является значение переменной
Вместо записи следующей функции:
def foo():
first_name = "daniel"
second_name = "daniel"
id = 1
return {'first_name':first_name, 'second_name':second_name}
Я хочу получить тот же результат с помощью функции:
create_dict_from_variables(first_name, second_name)
так или иначе, чтобы сделать это?
Ответы
Ответ 1
Вы не можете этого сделать.
Ваша функция может быть определена как:
def create_dict_from_variables(first_name, second_name):
return something_from(first_name, second_name)
и вы можете вызвать эту функцию:
create_dict_from_variables('abcd', 'efgh')
Эти два аргумента 'abcd'
и 'efgh'
не являются именованными переменными.
Ответ 2
Вы не можете сделать это, не записывая хотя бы имена переменных, но сокращенное обозначение можно написать следующим образом:
>>> foo = 1
>>> bar = 2
>>> d = dict(((k, eval(k)) for k in ('foo', 'bar')))
>>> d
{'foo': 1, 'bar': 2}
или как функция:
def createDict(*args):
return dict(((k, eval(k)) for k in args))
>>> createDict('foo','bar')
{'foo': 1, 'bar': 2}
вы также можете использовать globals()
вместо eval()
:
>>> dict(((k, globals()[k]) for k in ('foo', 'bar')))
Ответ 3
Вы можете использовать locals
, но я бы рекомендовал против него. Сделайте это явно.
>>> import this
[...]
Explicit is better than implicit.
[...]
Ваш код будет лучше, более предсказуемым, менее подверженным взлому и более понятным, если вы это сделаете явно.
Ответ 4
Нет, нет, потому что функции Python не получают информацию о переменных, используемых для вызова функции. Также представьте, что вы делаете что-то вроде этого:
create_dict_from_variables(first_name[:-3] + "moo", last_name[::2])
Функция не будет иметь возможности знать выражения, используемые для создания параметров.
Ответ 5
В принципе это возможно, передав имена переменных функции create_dict
, а затем дойдя до фрейма стека вызывающего абонента из функции create_dict
, используя модуль inspect
.