美文网首页
2020-02-19python高手之路学习随笔(3)

2020-02-19python高手之路学习随笔(3)

作者: 七天七念 | 来源:发表于2020-02-18 23:23 被阅读0次

    第三章 管理API变化

    在python中用下划线作私有API的前缀,比如_foo就是私有API, foo这种则是公有API

    当决定修改API的时候要通过文档对修改进行详细地记录,包括:
    1 记录新的接口API
    2 记录废弃的旧接口
    3 记录如何升级到新接口
    4旧API不要直接删除,等到维护实在太麻烦的时候再删除

    一般情况下使用""" 或者# 添加注释队API进行说明,不过一般情况下,用户很少会去看底层的API注释。
    更近一步的是使用名为warnings 模块,来对控制台进行强制输出提示

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    import warnings
    
    class Car(object):
        def turn_left(self):
    
            warnings.warn("测试,看看就知道了",DeprecationWarning)
    
            self.turn(direction="left")
    
        def turn(self,direction):
    
            pass
    
    
    from lianxi2 import Car
    c=Car()
    c.turn_left()
    

    按书上代码 理论上应该出信息,但是再python2.7之后的版本里面,DeprecationWarning,PendingDeprecationWarning,ImportWarning都已经被默认屏蔽了,如果想看见需要再控制台的情况下输入python -W all。
    一般这个办法不靠谱,推荐直接使用warnings的基类warnings.warn("测试,看看就知道了",Warning)
    附上warnings的错误异常

    类 描述

    Warning 这是所有警告类别类的基类。它是Exception的一个子类。

    UserWarning warn()的默认类别。

    DeprecationWarning 有关不推荐使用的功能的警告的基本类别(默认情况下被忽略)。

    SyntaxWarning 基本类别,用于警告关于可疑语法特征的警告。

    RuntimeWarning 有关可疑运行时功能的警告的基本类别。

    FutureWarning 关于构造的警告的基本类别将在未来语义上发生变化。

    PendingDeprecationWarning 基本类别,用于警告将来不推荐使用的功能(默认情况下会被忽略)。

    ImportWarning 在导入模块的过程中触发警告的基本类别(默认情况下会被忽略)。

    UnicodeWarning 与Unicode相关的警告的基本类别。

    如果想撤销警告可以使用

    import warnings
    
    def fxn():
        warnings.warn("deprecated", DeprecationWarning)
    
    with warnings.catch_warnings():
        warnings.simplefilter("ignore")
        fxn()
    

    在上下文管理器中,所有的警告都将被忽略。这使您可以使用已知不推荐的代码,而不必查看警告,同时不抑制其他可能不知道其使用弃用代码的代码的警告。注意:这只能在单线程应用程序中保证。如果两个或更多线程同时使用catch_warnings上下文管理器,则行为是未定义的。
    另一点 再控制台运行 python -W error 可以把这些警告全部转化为异常 跳出
    比如:

    python -W error 
    >>> import warnings
    >>> warnings.warn("测试测试")
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    UserWarning: 测试
    

    书上提供了另一个库debtcollector。

    from debtcollector import moves
    class Car(object):
        @moves.moved_method("turn",version="1.1")
        def turn_left(self):
            """
    
            Trun the car left
            """
    
            self.turn(direction="left")
    
        def turn(self,direction):
    
            pass
    

    理论上这玩意是通过装饰器来操作的。看着感觉简单,但是感觉并没有warnings好用,如果使用这个库,会让代码耦合性太高吧?

    本章总结
    1设计API要使用简单,同时api 变化最好是不变的情况下修改内容。
    2API最好是趋于一致性
    3编写文档,实时的
    4简单实现,优化代码

    高手之路第三章管理API变化学习完毕,感觉这章更多的是教学的API的设计思路,更API设置的时候插入警告。

    相关文章

      网友评论

          本文标题:2020-02-19python高手之路学习随笔(3)

          本文链接:https://www.haomeiwen.com/subject/tbwzfhtx.html