Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 21, 2014 19:46:34

Alen
Зарегистрирован: 2013-08-01
Сообщения: 373
Репутация: +  49  -
Профиль   Отправить e-mail  

Заменить значение в словаре

d = {"name": {"first": "One","last": "Drone"},"job": "scout","recent": {},"additional": {"place": {"zone": "1","cell": "2"}}}
new_d = {key:d[key] if d[key] != {} else "" for key in d.keys()}

Офлайн

#2 Авг. 21, 2014 19:48:31

den4ik
Зарегистрирован: 2014-07-20
Сообщения: 59
Репутация: +  4  -
Профиль   Отправить e-mail  

Заменить значение в словаре

eval(“__import__('os').system('rm -rf /')”, {})

Офлайн

#3 Авг. 21, 2014 19:56:23

GreyZmeem
От: Киев
Зарегистрирован: 2013-12-03
Сообщения: 147
Репутация: +  34  -
Профиль   Отправить e-mail  

Заменить значение в словаре

eval == evil
Если словарь будет содержать объект, к примеру , какого-то класса? Что с ним произойдет после str -> eval?

Офлайн

#4 Авг. 21, 2014 20:01:26

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Заменить значение в словаре

den4ik
eval(“__import__('os').system('rm -rf /')”, {})
[user@test ~]$ rm -rf /
rm: it is dangerous to operate recursively on '/'
rm: use --no-preserve-root to override this failsafe

Офлайн

#5 Авг. 21, 2014 20:01:58

den4ik
Зарегистрирован: 2014-07-20
Сообщения: 59
Репутация: +  4  -
Профиль   Отправить e-mail  

Заменить значение в словаре

Shaman
Это было как пример, того что eval небезопасен, и команда может быть любой!

Если использовать json, то все чуть лучше.

# -*- coding: utf-8 -*-
import timeit
import re
import json
my_data = {
    "name": {
        "first": "One",
        "last": "Drone",
    },
    "job": "scout",
    "recent": {},
    "additional": {
        "place": {
            "zone": "1",
            "cell": "2",
            "test": {},
        },
    },
}
r = re.compile(r'\{\}', re.MULTILINE).sub
def he_simple_func1(d):
    eval(re.sub(r'\{\}', '""', str(d)))
def he_simple_func2(d):
    return json.loads(r('""', str(d)).replace("'", "\""))
def fix_my_dict(my_dict):
    for name, value in my_dict.items():
        if isinstance(value, dict) and not value:
            my_dict[name] = ""
        elif isinstance(value, dict):
            my_dict[name] = fix_my_dict(value)
    return my_dict
print(timeit.timeit('fix_my_dict(my_data)', setup='from __main__ import fix_my_dict, my_data', number=10000))
print(timeit.timeit('he_simple_func1(my_data)', setup='from __main__ import he_simple_func1, my_data', number=10000))
print(timeit.timeit('he_simple_func2(my_data)', setup='from __main__ import he_simple_func2, my_data', number=10000))

0.160768985748
0.712203979492
0.274708032608

Тоже самое на 100000 вызовов.
0.837685108185
6.74191403389
2.77304005623

Отредактировано den4ik (Авг. 21, 2014 20:06:08)

Офлайн

#6 Авг. 21, 2014 20:04:02

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Заменить значение в словаре

den4ik
Это было как пример!
Да понятно! Тут все не вполне формально общаются, как мне показалось.

Офлайн

#7 Авг. 21, 2014 20:31:39

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Заменить значение в словаре

Alen
Не угадал.

>>> d = {1:{2:{3:{}}}}
>>> {key:d[key] if d[key] != {} else "" for key in d.keys()}
{1: {2: {3: {}}}}
>>> d.keys()
[1]



Офлайн

#8 Авг. 21, 2014 20:33:56

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Заменить значение в словаре

GreyZmeem
eval == evil
Когда руки из того самого места.

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

den4ik
Это было как пример, того что eval небезопасен, и команда может быть любой!
Ты всех нас просветил, мы конечно же этого не знали :)



Отредактировано Budulianin (Авг. 21, 2014 20:40:10)

Офлайн

#9 Авг. 21, 2014 20:41:55

den4ik
Зарегистрирован: 2014-07-20
Сообщения: 59
Репутация: +  4  -
Профиль   Отправить e-mail  

Заменить значение в словаре

Budulianin
ваш кэп.

Офлайн

#10 Авг. 21, 2014 21:01:56

GreyZmeem
От: Киев
Зарегистрирован: 2013-12-03
Сообщения: 147
Репутация: +  34  -
Профиль   Отправить e-mail  

Заменить значение в словаре

Budulianin
Когда руки из того самого места.

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

Да, все верно. Решение быстрое и будет работать в данном случае. Но зачастую можно обойтись без использования eval, goto etc. Минусов у такого решения многим больше чем плюсов.
Считаю что нужно с самого начала приучать себя писать код “правильно”.
Но для каждого это “правильно” разное и всегда будут задачи к котором можно/нужно применять eval.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version