пятница, 30 мая 2008 г.

В восторге от Python'a

Вот уже неделю сталкиваюсь с питоном в боевых условиях - понадобилось встроить его поддержку в С++-ный проект и реализовать на нем часть функционала. Теперь каюсь за то, что раньше недооценивал подобные языки (в смысле скриптовые). Более того, я просто в восторге от питона.

Например, мне нужно было сделать следующее: C++-ный код запускает Python-скрипт, который обрабатывает некоторые данные. Пользователь может захотеть написать свои обработчики для конкретных данных. Сложность состояла в том, как объяснить исходному скрипту, что есть другие реализации. Вот как позволяет это делать Python:


Теперь, все что надо пользователю - это написать класс с именем тип_данныхExt и методом process_data() и сохранить его в файле тип_данных.py. Получается намного проще, чем делать это на С++, причем проще и для разработчика и для пользователя.

3 комментария:

Yuriy Volkov комментирует...

мне тут мужики говорят, что
exec "from " + name + " import " + class_name
будет работать медленно и небезопасно, а эксепшены подавлять тоже не хорошо - лучше сходить на http://pypi.python.org и там посмотреть как библиотеки реализованны )). Как работется на новом месте?

Yuriy Volkov комментирует...

вот, мужики наваяли:

testExt.py:

class Plugin(object):
  def __init__(self):
    print "Initialized"
  def processed(self):
    print "Processed"

test_imp.py:

import traceback
def loadPlugin(mod_name,class_name = "Plugin"):
  try:
    mod = __import__(mod_name + "Ext")
    return getattr(mod,class_name)()
  except:
    traceback.print_exc()
  return None
loadPlugin("test").processed()

грят так лучше будет.

sash_ko комментирует...

Спасибо за подсказку и ссылку. Как раз то, что надо, а то до __import__ наверно бы не скоро дошел, читая доку по диагонали :)
Работается отлично, работа оказалась даже интересное, чем ожидал (в частности из-за питона). Сейчас разбираюсь в boost::asio и boost::python. Дальше на очереди Qt. Вообщем есть чем заняться :)