создать словарь из списка переменных - PullRequest
15 голосов
/ 29 февраля 2012

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

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

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)

есть ли вообще так?

Ответы [ 5 ]

14 голосов
/ 29 февраля 2012

Вы не можете сделать это без записи хотя бы имен переменных, но сокращение можно написать так:

>>> 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')))
4 голосов
/ 29 февраля 2012

Вы можете использовать locals, но я бы рекомендовал против этого.Сделайте это явно.

>>> import this
[...]
Explicit is better than implicit.
[...]

Ваш код, как правило, будет лучше, более предсказуемым, менее подверженным взлому и более понятным, если вы сделаете это явно.

2 голосов
/ 29 февраля 2012

Вы не можете сделать это.

Ваша функция может быть определена как:

def create_dict_from_variables(first_name, second_name):
    return something_from(first_name, second_name)

, и вы можете вызвать эту функцию:

create_dict_from_variables('abcd', 'efgh')

Эти два аргумента 'abcd' и 'efgh' не являются именованными переменными.

1 голос
/ 29 февраля 2012

Нет, нет, потому что функции Python не получают информацию о переменных, используемых для вызова функции.Кроме того, представьте, что вы делаете что-то вроде этого:

create_dict_from_variables(first_name[:-3] + "moo", last_name[::2])

Функция не сможет узнать выражения, используемые для создания параметров.

0 голосов
/ 21 декабря 2017

В принципе это возможно, передавая имена переменных в функцию create_dict и затем достигая фрейма стека вызывающего абонента из функции create_dict с помощью модуля inspect.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...