公共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_valuereparse。 但是,如何处理坏线是由高级函数决定的 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上的第一个版本。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java将多个线程中的函数放入单个队列   数组在Java中,如何在不改变整数顺序的情况下找到整数组的顺序?   java控制器属于表示层?   java Apache Ivy和本地Maven repo如何处理使用Maven 3构建的快照   Java可与泛型类型进行比较   java这个表达式在泛型中是什么意思   JavaEclipse和TeamCity插件   java检测构造函数中的final是否为空   java如何在StanfordCoreNLP管道中同时使用词汇化和依赖性解析器?   java在AntUnit控制台日志中显示完整异常堆栈跟踪   lambda如何与Java 8供应商建立连锁关系   如何让GRPC的重试机制在Kubernetes集群中使用grpcjava工作?   如何使用openjdk:7 Docker映像和Gradle包装器避免“EC参数错误”?   java将集合映射扩展为一维映射新的“无法推断函数接口类型”