2014-12-18 3 views
1

Я хотел бы повернуть строку в словаре в вызываемую команду.Как превратить строку в команду

binds = {"<Control-n>" : 'Commands.New()'} 
for n, b in binds.values(): 
    root.bind_all(n, b) 

Поэтому я хотел бы связать все словаря.

+0

Если вы действительно хотите выполнить строку в виде кода на основе python, вы можете использовать 'exec'. Например, 'root.bind_all (n, lambda: exec (b))' –

+3

'eval()' и 'exec()' считаются вредными и не должны использоваться. Для справки: http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html – moooeeeep

+0

У вас есть полный контроль над содержимым словаря? Может ли кто-нибудь ввести что-то вредоносное, или даже глупо, и удалить все на своем жестком диске? Если да, не используйте 'eval'. –

ответ

4

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

Вместо этого, вы должны сделать значение Словаря в быть ссылками на функцию самих объектов:

binds = {"<Control-n>" : Commands.New} 
for n, b in binds.items(): 
    root.bind_all(n, b) 

Кроме того, вы должны называть dict.items (или dict.iteritems в Python 2.x) вместо dict.values. Первый метод возвращает кортежи пар ключ/значение, которые вы можете распаковать, как вы делаете. Однако второй метод возвращает значения.

+0

Он по-прежнему дает мне ту же ошибку. Трекбэк (последний последний звонок): Файл «E: \ Pusdo Code \ main.py ", строка 150, в Main() Файл« E: \ Pusdo Code \ main.py », строка 110, in Main Bind (корень) Файл« E: \ Pusdo Code \ main.py ", строка 100, в Bind для n, b в binds.values ​​(): TypeError: объект 'function' не является итерабельным – perfectvid2012

+0

Я думаю, что вы хотите' blind.items() 'not' bind.values ​​() '. – Symmitchry

+0

А, я пропустил это. См. Мое редактирование. – iCodez