2012-03-05 6 views
2

В настоящее время я работаю над экспериментом, в котором я использую интерпретатор для старого языка сценариев в игре. Это четвертый язык, поэтому я полагаю, что было бы просто просто иметь инструкции (после проверки и сантирования) в большой список.Как вызвать функцию, основанную на записи списка?

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

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

Так, например, если бы я был:

"Hello, world!" notify 

... код будет проверять уведомит в списке, а затем выполнить функцию уведомления. Суть в следующем: как преобразовать строку в имя функции?

+0

Итак, вы хотите «Привет, мир!». notify' вести себя как 'notify (« Hello, world! »)'? –

+0

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

+0

Я не знаком с использованием регулярных выражений в Python, но похоже, что вам нужно будет сопоставить строку со всем в кавычках (исключительно) и убедитесь, что вы проверяете экранированные кавычки. Затем вы будете использовать группу захвата, чтобы определить, какую функцию вызывать. Анализ всегда может быть громоздким. –

ответ

4

Вы могли бы сохранить словарь функций код может вызывать, а затем выполнить посмотреть, когда вам нужно:

def notify(s): 
    print(s) 

d = {"notify": notify} 

d["notify"]("Hello, world!") 
+0

Не будет ли это просто вызвать функцию уведомления и поместить ее результат в значение этого словаря? – Kelketek

+3

Функции в python - это объекты первого класса, 'notify' - это просто имя, связанное с этой функцией (попробуйте код, он работает как есть). – strcat

+0

Работал как шарм! Благодаря! – Kelketek

0

Вы можете сделать это через местных жителей который является словарь с е текущее таблица символов:

locals()["notify"]() 

или хотя глобал которая возвращает словарь с таблицей символов в глобал:

globals()["notify"]() 

Вы можете привести аргументы слишком например .:

locals()["notify"]("Hello, world!") 

или

globals()["notify"]("Hello, world!") 
+0

Могу ли я создать свою собственную таблицу символов? Я не хочу, чтобы пользователь мог запускать любую команду. – Kelketek

+1

'locals()' и 'globals()' возвращаемые словари, поэтому вы можете сделать свой собственный вместо этого. – strcat

+0

Да @strcat является правильным. Вы можете использовать этот интерфейс: http://docs.python.org/library/symtable.html#module-symtable для просмотра этих таблиц символов. –

0

Что-то вроде:

import re 
class LangLib(object): 
    pattern = re.compile(r'"(.*?)" (.*)') 
    def run_line(self, line): 
     arg, command = re.match(LangLib.pattern, line).groups() 
     return getattr(self, command)(arg) 
    def notify(self, arg): 
     print arg 

Тогда ваш код двигателя будет:

parser = LangLib() 
for line in program_lines: 
    parser.run_line(line) 
0

Если у вас есть dict называется commands, который отображает имена функций, вы можете сделать это следующим образом:

def my_notify_function(): 
    print(stack.pop) 

commands = {'notify': my_notify_function, ...} 

for item in program: 
    if item in commands: 
     commands[item]() 
    else: 
     stack.push(item) 
0

Создание словаря имен функций и некоторых тегов.

Я пробовал это несколько раз раньше, он работает очень хорошо.

Смежные вопросы