而不是eval
ing腳本,也許你應該考慮做一個包呢? 解析CSV是一回事 - 格式簡單而規則,解析XML需要完全另一種方法。考慮到你不想從頭開始編寫每一個解析器,爲什麼不寫一堆小模塊,每個模塊都有相同的API並使用它們?我相信,使用Python本身(不是一些模板DSL)對於這類事情是理想的。
例如,這是我在一個small torrent-fetching script看到我使用的方法:
主程序:
...
def import_plugin(name):
mod = __import__(name)
components = name.split('.')
for comp in components[1:]:
mod = getattr(mod, comp)
return mod
...
feed_parser = import_plugin('parsers.%s' % feed['format'])
data = feed_parser(...)
...
parsers/csv.py
:
#!/usr/bin/python
from __future__ import absolute_import
import urllib2
import csv
def parse_feed(...):
...
如果你不」特別喜歡動態加載的模塊,你可以考慮編寫一個模塊,其中包含幾個解析類(可能來自某些「抽象語法分析器」)屁股)。
class BaseParser(object):
...
class CSVParser(BaseParser):
...
register_feed_parser(CSVParser, ['text/plain', 'text/csv'])
...
parsers = get_registered_feed_parsers(feed['mime_type'])
data = None
for parser in parsers:
try:
data = parser(feed['data'])
if data is not None: break
except ParsingError:
pass
...
謝謝drdaeman,我真的很喜歡這個解決方案,並可能最終使用它。唯一不足的地方是解析腳本需要存儲在數據庫中。 的原因數據庫的要求是這個網站的管理員最好將能夠創建和管理這些解析腳本(有幾十人)在web界面,但即使管理員用戶信賴,其仍然不希望的,他們輸入的代碼最終得到評估。 我認爲這將歸結爲創建一個新的模塊或與您的建議。再次感謝! – 2009-06-23 17:05:33