公共lisp条件系统在python中的实现。
conditions的Python项目详细描述
公共lisp条件系统在python中的实现。
免费软件:BSD许可证。
基本原理
通用lisp(cl)有一个非常丰富的条件系统。cl中的条件是某种 ,不仅用于异常处理,还用于某些其他模式。 有一个很好的解释他们是如何工作的-这本书的一章 彼得·塞贝尔的实用通用语言: Beyond Exception Handling: Conditions and Restarts。
python的例外只涉及本书中的一个场景,但是常见的lisp条件 允许更有趣的用法,尤其是“重新启动”。重启是一种继续的方式 在发出异常信号后执行代码,而不展开调用堆栈。 我将重复:不展开调用堆栈。
此外,条件允许库的作者定义 选择接管例外。
示例
这是本书中的示例,但使用conditions库在python中实现:
def parse_log_entry(text): """This function does all real job on log line parsing. it setup two cases for restart parsing if a line with wrong format was found. Restarts: - use_value: just retuns an object it was passed. This can be any value. - reparse: calls `parse_log_entry` again with other text value. Beware, this call can lead to infinite recursion. """ text = text.strip() if well_formed_log_entry_p(text): return LogEntry(text) else: def use_value(obj): return obj def reparse(text): return parse_log_entry(text) with restarts(use_value, reparse) as call: return call(signal, MalformedLogEntryError(text)) def log_analyzer(path): """This procedure replaces every line which can't be parsed with special object MalformedLogEntry. """ with handle(MalformedLogEntryError, lambda (c): invoke_restart('use_value', MalformedLogEntry(c.text))): for filename in find_all_logs(path): analyze_log(filename) def log_analyzer2(path): """This procedure considers every line which can't be parsed as a line with ERROR level. """ with handle(MalformedLogEntryError, lambda (c): invoke_restart('reparse', 'ERROR: ' + c.text)): for filename in find_all_logs(path): analyze_log(filename)
我们这里有一个函数parse_log_entry,它定义了两个 处理异常情况的方法:use_value和reparse。 但是,如何处理坏线是由高级函数决定的 log_analyser。原著的章节只有一个版本 log_analyser,但我添加了一个替代的log_analyser2到 说明为什么重新启动是一个有用的模式。这个的价值 模式是指从低层移动决策代码的能力。 库函数转换为更高级别的业务逻辑。
这个例子的完整版本可以在example/example.py文件中找到。
安装
pip install conditions
开发
要运行所有测试,请运行:
tox
注意,要合并来自所有tox环境的覆盖率数据,请运行:
Windows | ^{pr 4}$ |
---|---|
Other | ^{pr 5}$ |
更改日志
0.2.0(2016-04-05)
- 添加了上下文管理器restarts和管理器restart现在获取 只返回一个函数并返回一个类似于调用代码的函数 重新启动。
0.1.0(2016-03-29)
- pypi上的第一个版本。