Python Cookbook(第3版)中文版:14.11 输出警告信息

14.11 输出警告信息?

问题?

你希望自己的程序能生成警告信息(比如废弃特性或使用问题)。

解决方案?

要输出一个警告消息,可使用 warning.warn() 函数。例如:

import warnings

def func(x, y, logfile=None, debug=False):
    if logfile is not None:
         warnings.warn(‘logfile argument deprecated‘, DeprecationWarning)
    ...

warn() 的参数是一个警告消息和一个警告类,警告类有如下几种:UserWarning, DeprecationWarning,
SyntaxWarning, RuntimeWarning, ResourceWarning, 或 FutureWarning.

对警告的处理取决于你如何运行解释器以及一些其他配置。
例如,如果你使用 -W all 选项去运行Python,你会得到如下的输出:

bash % python3 -W all example.py
example.py:5: DeprecationWarning: logfile argument is deprecated
  warnings.warn(‘logfile argument is deprecated‘, DeprecationWarning)

通常来讲,警告会输出到标准错误上。如果你想讲警告转换为异常,可以使用 -W error 选项:

bash % python3 -W error example.py
Traceback (most recent call last):
  File "example.py", line 10, in <module>
    func(2, 3, logfile=‘log.txt‘)
  File "example.py", line 5, in func
    warnings.warn(‘logfile argument is deprecated‘, DeprecationWarning)
DeprecationWarning: logfile argument is deprecated
bash %

讨论?

在你维护软件,提示用户某些信息,但是又不需要将其上升为异常级别,那么输出警告信息就会很有用了。
例如,假设你准备修改某个函数库或框架的功能,你可以先为你要更改的部分输出警告信息,同时向后兼容一段时间。
你还可以警告用户一些对代码有问题的使用方式。

作为另外一个内置函数库的警告使用例子,下面演示了一个没有关闭文件就销毁它时产生的警告消息:

>>> import warnings
>>> warnings.simplefilter(‘always‘)
>>> f = open(‘/etc/passwd‘)
>>> del f
__main__:1: ResourceWarning: unclosed file <_io.TextIOWrapper name=‘/etc/passwd‘
 mode=‘r‘ encoding=‘UTF-8‘>
>>>

默认情况下,并不是所有警告消息都会出现。-W 选项能控制警告消息的输出。
-W all 会输出所有警告消息,-W ignore 忽略掉所有警告,-W error 将警告转换成异常。
另外一种选择,你还可以使用 warnings.simplefilter() 函数控制输出。
always 参数会让所有警告消息出现,`ignore 忽略调所有的警告,error 将警告转换成异常。

对于简单的生成警告消息的情况这些已经足够了。
warnings 模块对过滤和警告消息处理提供了大量的更高级的配置选项。
更多信息请参考 Python文档

艾伯特(http://www.aibbt.com/)国内第一家人工智能门户

原文地址:https://www.cnblogs.com/5rjscn/p/8542850.html

时间: 2024-08-02 19:41:43

Python Cookbook(第3版)中文版:14.11 输出警告信息的相关文章

Python Cookbook(第3版) 中文版 pdf完整版高清下载

Python Cookbook(第3版)中文版介绍了Python应用在各个领域中的一些使用技巧和方法,其主题涵盖了数据结构和算法,字符串和文本,数字.日期和时间,迭代器和生成器,文件和I/O,数据编码与处理,函数,类与对象,元编程,模块和包,网络和Web编程,并发,实用脚本和系统管理,测试.调试以及异常,C语言扩展等. 本书覆盖了Python应用中的很多常见问题,并提出了通用的解决方案.书中包含了大量实用的编程技巧和示例代码,并在Python 3.3环境下进行了测试,可以很方便地应用到实际项目中

Python Cookbook(第3版)中文版:15.11 用Cython写高性能的数组操作

15.11 用Cython写高性能的数组操作? 问题? 你要写高性能的操作来自NumPy之类的数组计算函数.你已经知道了Cython这样的工具会让它变得简单,但是并不确定该怎样去做. 解决方案? 作为一个例子,下面的代码演示了一个Cython函数,用来修整一个简单的一维双精度浮点数数组中元素的值. # sample.pyx (Cython) cimport cython @cython.boundscheck(False) @cython.wraparound(False) cpdef clip

Python Cookbook(第3版)中文版:14.12 调试基本的程序崩溃错误

14.12 调试基本的程序崩溃错误? 问题? 你的程序崩溃后该怎样去调试它? 解决方案? 如果你的程序因为某个异常而崩溃,运行 python3 -i someprogram.py 可执行简单的调试.-i 选项可让程序结束后打开一个交互式shell.然后你就能查看环境,例如,假设你有下面的代码: # sample.py def func(n): return n + 10 func('Hello') 运行 python3 -i sample.py 会有类似如下的输出: bash % python3

Python Cookbook(第3版)中文版:15.13 传递NULL结尾的字符串给C函数库

15.13 传递NULL结尾的字符串给C函数库? 问题? 你要写一个扩展模块,需要传递一个NULL结尾的字符串给C函数库.不过,你不是很确定怎样使用Python的Unicode字符串去实现它. 解决方案? 许多C函数库包含一些操作NULL结尾的字符串,被声明类型为 char * .考虑如下的C函数,我们用来做演示和测试用的: void print_chars(char *s) { while (*s) { printf("%2x ", (unsigned char) *s); s++;

Python Cookbook(第3版)中文版:15.1 使用ctypes访问C代码

15.1 使用ctypes访问C代码? 问题? 你有一些C函数已经被编译到共享库或DLL中.你希望可以使用纯Python代码调用这些函数,而不用编写额外的C代码或使用第三方扩展工具. 解决方案? 对于需要调用C代码的一些小的问题,通常使用Python标准库中的 ctypes 模块就足够了.要使用 ctypes ,你首先要确保你要访问的C代码已经被编译到和Python解释器兼容(同样的架构.字大小.编译器等)的某个共享库中了.为了进行本节的演示,假设你有一个共享库名字叫 libsample.so 

Python Cookbook(第3版)中文版:15.12 将函数指针转换为可调用对象

15.12 将函数指针转换为可调用对象? 问题? 你已经获得了一个被编译函数的内存地址,想将它转换成一个Python可调用对象,这样的话你就可以将它作为一个扩展函数使用了. 解决方案? ctypes 模块可被用来创建包装任意内存地址的Python可调用对象.下面的例子演示了怎样获取C函数的原始.底层地址,以及如何将其转换为一个可调用对象: >>> import ctypes >>> lib = ctypes.cdll.LoadLibrary(None) >>

python书籍推荐:Python Cookbook第三版中文

所属网站分类: 资源下载 > python电子书 作者:熊猫烧香 链接:http://www.pythonheidong.com/blog/article/44/ 来源:python黑洞网 内容简介 <Python Cookbook(第3版)中文版>介绍了Python应用在各个领域中的一些使用技巧和方法,其主题涵盖了数据结构和算法,字符串和文本,数字.日期和时间,迭代器和生成器,文件和I/O,数据编码与处理,函数,类与对象,元编程,模块和包,网络和Web编程,并发,实用脚本和系统管理,测

python cookbook第三版学习笔记五:datetime

Python中表示时间的模块是datetime,引入下面的模块 from datetime import datetime,timedelta print datetime.today()  #打印出当前的时间 E:\python2.7.11\python.exe E:/py_prj/python_cookbook.py 2017-04-26 21:58:05.663000 我们还可以对时间进行加减操作.这里要用到timedelta模块 这个模块有5个重要参数分别是days,minutes,se

python cookbook第三版学习笔记十三:类和对象(三)描述器

__get__以及__set__:假设T是一个类,t是他的实例,d是它的一个描述器属性.读取属性的时候T.d返回的是d.__get__(None,T),t.d返回的是d.__get__(t,T).说法比较绕,我们来看一个实例: class Descriptor(object):     def __get__(self, instance, owner):         return 'get',self,instance,owner class T(object):     d=Descri