Элегантный способ создания dict из локальных переменных в Python - PullRequest
0 голосов
/ 23 апреля 2020

Что-то, что я создаю dict из localals (), например:

var1 = 1
var2 = 2
var3 = 3
...
my_dict = dict(
    var1=var1,
    var2=var2,
    var3=var3,
    ...
)

Или:

var1 = 1
var2 = 2
var3 = 3
...
keys = 'var1 var2 var3 ...'.split()
my_dict = {k: v for k, v in locals().items() if k in keys}

Реальный пример ::

data = dict(
    order_num=order_num,
    charge=charge,
    paid_at=paid_at,
    total=total,
    amount=amount,
    cut=cut,
    room_name=room_name,
    room_slug=room_slug,
    room_type=room_type,
    community=community,
    remain=remain,
)

Есть ли способ сделать это более элегантно?

Ответы [ 4 ]

0 голосов
/ 05 мая 2020

После долгих попыток следующий код - почти то, что я хочу:

class LocalDict(dict):
    def __new__(cls, spaces, attrs):
         return {k: v for k, v in spaces.items() if k in attrs.split()}

def foo():
    a = 1
    b = c = 2
    my_dict = LocalDict(locals(), 'a b c')
    return my_dict

print(foo())  # {'a': 1, 'b': 2, 'c': 2}

И мне интересно, есть ли способ, которым мне не нужно передавать locals в LocalDict класс.

0 голосов
/ 23 апреля 2020

Как насчет этого?

var1 = 1
var2 = 2
var3 = 3
my_dict = {k: v for k, v in locals().items() if k.startswith('var')}

или

var1 = 1
var2 = 2
var3 = 3
var4 = "abc"
my_dict = {k: v for k, v in locals().items() if isinstance(v, int) or isinstance(v, str)}
0 голосов
/ 23 апреля 2020

Поскольку все встроенные члены locals() начинаются и заканчиваются на __, вы можете отфильтровать их по этим префиксу и суффиксу. Кроме того, вы можете отфильтровать функции, используя callable:

Например:

a = 1
b = 2
output = {k:v for k,v in locals().items() if not (k.startswith("__") and k.endswith("__")) and not callable(v)}
print(output) # output: {'a': 1, 'b': 2}
0 голосов
/ 23 апреля 2020

На самом деле все зависит от того, как вам нужно работать с данными. Ваши методы выше, являются здравыми, особенно понимание слова. Так что кроме старомодного способа:

{"key": "value", ... }

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

Надеюсь, это поможет!

...