Python-警告处理
python 下Warning的使用
起因是这样的,当我使用pymysql模块执行建表的sql语句时获,在控制台输出了红色的消息,但是程序并没有终止而是继续运行了
sql语句如下:
CREATE TABLE IF NOT EXISTS test(age int);
整体代码:
import pymysql
conn = pymysql.connect(
user= "root",
password="",
database="test"
)
c = conn.cursor()
c.execute("create table if not exists abc(age int)")
得到的警告信息如下:
"""
NoneType: None
/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pymysql/cursors.py:170: Warning: (1050, "Table 'abc' already exists")
result = self._query(query)
"""
Process finished with exit code 0
sql语句是如果表存在则放弃创建,这意味着这个警告是应该的,并没有逻辑上的错误,但是这个红色的消息,让人看着不爽,于是找到了如下解决方案:
from warnings import filterwarnings
filterwarnings("ignore",category=pymysql.Warning)
问题得到解决,作为强迫症患者,必须在深入研究一下,得出以下结论:
warning模块中主要的两个方法
1.warn
该方法用于输出一个警告信息
#参数一: message 表示警告的详细信息
#参数二: category 类别,需要一个类作为参数,该类必须是Warning的子类,Warning类是Exception的子类,用于给警告设置一个具体的类型
#参数三: stacklevel 指定调用栈的层级,用于确定要从哪一级获取行号
#参数四: 没研究
stacklevel在源码中的调用:
上述代码获得一个frame,用于获取行号
由以上源码可以get到一个小技能即获取行号
python获取行号:
import sys
f = sys._getframe() # f 是一个对象class为 frame 但是该类无法直接访问,猜想是系统底层隐藏的毕竟与解释器核心数据相关
print(f.f_lineno) # f_lineno就是用于获取行号的属性
"""
在源码中可以看到_getframe函数是可以给一个整型参数的,
经过测试,得出结论,该参数用于,指定从栈的哪一个位置获取行号,
"""
#测试代码:
1 import sys
2 def task():
3 f = sys._getframe(2)
4 print(f.f_lineno)
5
6 def task2():
7 task()
8
9 task2()
"""
0表示从当前位置,即执行_getframe的地方
1表示获取上一级调用位置的行号 即第7行
2表示上上级 即第9行 以此类推...
"""
2.filterwarnings
该方法用于过滤警告信息
#参数action: 表示如何处理这个警告
可选的值 "error", "ignore", "always", "default", "module","once"
error会将警告作为异常抛出
ignore表示忽略该类警告不会打印
once表示该相同类型相同消息的警告仅打印一次
#参数category: 需要一个类,表示是要过滤的警告类别
#参数module: 需要一个模块,表示是要过滤的模块名称
#参数lineno: 一个整型,表示要过滤哪一行的警告 0表示所有行 其他值貌似没有作用
意外发现
在查看源码是,发现了一个用于表示警告消息的类
该类非常简单,就是保存了一些警告信息,然后覆盖了 __str__
函数,用于自定义字符串形式
其中的初始化函数引起了我的注意,分析了一下,发现这个写法不错,可以简化初始化中的属性赋值操作于是做了一下实验:
# 通用的类初始化方法
class Person():
def __init__(self,a,b,c):
for k,v in locals().items():
if k != "self":
setattr(self,k,v)
p = Person(1,2,3)
print(p.a)
print(p.b)
该方法最大的好处在于,无论初始化方法中需要多少参数都可以一一赋值,对于初始化参数多的类非常友好;
其原理是通过locals()来获取函数中的局部变量的字典形式,然后遍历字典,排除self之后其他的都设置为self的属性,用形参的名字作为熟悉名,大大减少了一堆重复的赋值代码!
否则你的代码可能是这样的:
class Person():
def __init__(self,a,b,c,d):
self.a = a
self.b = b
self.c = c
self.d = d
p = Person(1,2,3,4)
print(p.a)
print(p.b)
print(p.c)
如果参数特比多的话,你懂的......
Python-警告处理的更多相关文章
- Python警告:InsecureRequestWarning、InsecurePlatformWarning、SNIMissingWarning
SSL警告 urllib3将基于证书验证支持的级别发出几种不同的警告.这些警告表示特定情况,可以通过不同方式解决. InsecureRequestWarning 当在未启用证书验证的情况下对HTTPS ...
- 如何禁用python警告
有-W选项. python -W ignore foo.py 所属网站分类: python基础 > 综合&其它 作者:jiem 链接:http://www.pythonheidong.c ...
- python远程连接paramiko 模块和堡垒机实现
paramiko使用 paramiko模块是基于python实现了SSH2远程安全连接,支持认证和密钥方式,可以实现远程连接.命令执行.文件传输.中间SSH代理功能 安装 pip install pa ...
- Python模块学习 - Paramiko
简介 ssh是一个协议,OpenSSH是其中一个开源实现,paramiko是Python的一个库,实现了SSHv2协议(底层使用cryptography). 有了Paramiko以后,我们就可以在Py ...
- Python操作远程服务器paramiko模块介绍
paramiko模块是基于Python实现的SSH远程安全连接,可以提供在远程服务器上执行命令.上传文件到服务器或者从指定服务器下载文件的功能. paramiko模块安装方法 paramiko模块不是 ...
- 如何使用python远程操作linux
在云服务测试中,往往需要我们进入云服务内容进行相关内容的测试.这测试可以使用平台自身的noVNC.外部辅助xshell等工具连接到云服务内部进行测试.但是在如此反复的测试操作中,就需要用到自动化测试方 ...
- Pytest权威教程10-捕获警告信息
目录 捕获警告信息 @pytest.mark.filterwarnings 禁用警告摘要 完全禁用警告捕获 弃用警告和待命记录警告 确保代码触发弃用警告 用警告函数断言警告 录制警告 自定义失败消息 ...
- paramiko模块,线程,进程
关于paramiko模块 paramiko是基于Python实现的ssh2远程安全连接,支持认证及密钥方式远程执行命令.文件传输,中间ssh代理等 paramiko的安装: 安装好之后,用parami ...
- 堡垒机之paramiko模块
一.paramiko简单介绍 场景预设: 很多运维人员平时进行维护linux/unix主机时候,无非通过ssh到相应主机操作,那么一旦主机有成千上百台,那该如何应对,这时候我们需要批处理工具,基于py ...
- 使用paramiko中 Server not found in known_hosts的错误解决
报错的格式如下: 主要是缺少set_missing_host_key_policy配置信息. set_missing_host_key_policy方法,是制定连接远程主机没有本地密钥或HostKey ...
随机推荐
- Web前端基础(14):jQuery基础(一)
1. jQuery概述 1.1 为什么要使用jQuery 在用js写代码时,会遇到一些问题: window.onload 事件有事件覆盖的问题,因此只能写一个事件. 代码容错性差. 浏览器兼容性问题. ...
- MySQL复习值代码知识点(2)
目录 总汇表 order by使用举例 group by使用举例 limit举例 group by 与order by 联合使用 having的使用 SQL运行结果查询 总汇表 order by 排序 ...
- SQL Server查询数据库表字段类型
select b.name,a.name,c.name,a.xprec,a.xscalefrom syscolumns aleft outer join sysobjects b ON a.id=b ...
- python3字符串常用方法
整型和布尔值的转换: bin -- 十进制转二进制 int("1101",2) -- 二进制转十进制 十进制转二进制的算法 除2 取余,获取的所有余数从下往上进行计算 二进制转十进 ...
- linux 系统下Anaconda的安装【安装python3.6环境首选】
如果你不想使用python3.6的源码安装包,不想各种繁琐的配置命令,那Anacoda里边自带的python3.6环境就最合适不过了,下面来介绍下anacoda的安装过程,~so easy~Anaco ...
- 两个list合并成一个list的操作
addAll 添加另一集合里面的元素 add 添加整个集合包括 [] Stream 操作 合并两个lis 出自http://www.it1352.com/963663.html public cl ...
- java8-9-Stream 的中间操作
Stream 的中间操作 filter 过滤 排除元素 filter(T -> boolean) 保留 boolean 为 true 的元素
- Python机器学习笔记——One Class SVM
前言 最近老板有一个需求,做单样本检测,也就是说只有一个类别的数据集与标签,因为在工厂设备中,控制系统的任务是判断是是否有意外情况出现,例如产品质量过低,机器产生奇怪的震动或者机器零件脱落等.相对来说 ...
- 2019-2020-1 20199305《Linux内核原理与分析》第一周作业
进入Linux的世界 1.何为Linux? Linux是一个操作系统. 2.Linux的由来 芬兰赫尔辛基大学的研究生 Linus Torvalds接触Unix时认为其费用不友好,决定自己开发一个操作 ...
- python爬虫初认识
一.爬虫是什么? 如果我们把互联网比作一张大的蜘蛛网,数据便是存放于蜘蛛网的各个节点,而爬虫就是一只小蜘蛛, 沿着网络抓取自己的猎物(数据)爬虫指的是:向网站发起请求,获取资源后分析并提取有用数据的程 ...