Создать словарь из списка переменных

Я ищу способ создания словаря без явного написания ключа Я хочу создать функцию, которая получает числовые переменные, и создать словарь, где имена переменных являются ключами, а их значением является значение переменной

Вместо записи следующей функции:

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.