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-警告处理的更多相关文章

  1. Python警告:InsecureRequestWarning、InsecurePlatformWarning、SNIMissingWarning

    SSL警告 urllib3将基于证书验证支持的级别发出几种不同的警告.这些警告表示特定情况,可以通过不同方式解决. InsecureRequestWarning 当在未启用证书验证的情况下对HTTPS ...

  2. 如何禁用python警告

    有-W选项. python -W ignore foo.py 所属网站分类: python基础 > 综合&其它 作者:jiem 链接:http://www.pythonheidong.c ...

  3. python远程连接paramiko 模块和堡垒机实现

    paramiko使用 paramiko模块是基于python实现了SSH2远程安全连接,支持认证和密钥方式,可以实现远程连接.命令执行.文件传输.中间SSH代理功能 安装 pip install pa ...

  4. Python模块学习 - Paramiko

    简介 ssh是一个协议,OpenSSH是其中一个开源实现,paramiko是Python的一个库,实现了SSHv2协议(底层使用cryptography). 有了Paramiko以后,我们就可以在Py ...

  5. Python操作远程服务器paramiko模块介绍

    paramiko模块是基于Python实现的SSH远程安全连接,可以提供在远程服务器上执行命令.上传文件到服务器或者从指定服务器下载文件的功能. paramiko模块安装方法 paramiko模块不是 ...

  6. 如何使用python远程操作linux

    在云服务测试中,往往需要我们进入云服务内容进行相关内容的测试.这测试可以使用平台自身的noVNC.外部辅助xshell等工具连接到云服务内部进行测试.但是在如此反复的测试操作中,就需要用到自动化测试方 ...

  7. Pytest权威教程10-捕获警告信息

    目录 捕获警告信息 @pytest.mark.filterwarnings 禁用警告摘要 完全禁用警告捕获 弃用警告和待命记录警告 确保代码触发弃用警告 用警告函数断言警告 录制警告 自定义失败消息 ...

  8. paramiko模块,线程,进程

    关于paramiko模块 paramiko是基于Python实现的ssh2远程安全连接,支持认证及密钥方式远程执行命令.文件传输,中间ssh代理等 paramiko的安装: 安装好之后,用parami ...

  9. 堡垒机之paramiko模块

    一.paramiko简单介绍 场景预设: 很多运维人员平时进行维护linux/unix主机时候,无非通过ssh到相应主机操作,那么一旦主机有成千上百台,那该如何应对,这时候我们需要批处理工具,基于py ...

  10. 使用paramiko中 Server not found in known_hosts的错误解决

    报错的格式如下: 主要是缺少set_missing_host_key_policy配置信息. set_missing_host_key_policy方法,是制定连接远程主机没有本地密钥或HostKey ...

随机推荐

  1. 解决python安装第三方库超时问题

    这里说明一下,配置文件中的url还可以换成下面的URL 阿里云 http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.u ...

  2. ASP.NET MVC教程二:ASP.NET MVC应用程序结构详解

    在上一篇文章中,讲解了一些MVC的概念,并且创建了第一个ASP.NET MVC项目,这篇文章将讲解ASP.NET MVC程序中的代码解构,新创建的MVC应用程序解构如下图所示: 一.App_Data ...

  3. zabbix snmp监控与主被模式

    1.snmp基础介绍 snmp全称是简单网络管理协议 为什么要用? 路由器交换机无法安装agent程序,但是都提供snmp服务端, 我们可以使用zabbix的snmp方式监控snmp服务端的数据 2. ...

  4. 《跟我学shiro》

    张开涛<跟我学shiro>博客系列: Shiro目录 第一章  Shiro简介 第二章  身份验证 第三章  授权 第四章  INI配置 第五章  编码/加密 第六章  Realm及相关对 ...

  5. jd-gui反编译报错// INTERNAL ERROR //

    最近在反编译class和jar包的时候,发现部分class无法反编译出来,换了最新版本的jd-gui和多个版本都不行,只能放弃了 解决方案:GitHub上找Luyten这个工具反编译 luyten是P ...

  6. Python 元組 Tuple

    元組 Tuple 宣告 元組是用逗號分隔的一列值: >>> t = 'a',1,'b',2,'c',3>>> t('a', 1, 'b', 2, 'c', 3)&g ...

  7. read write方式打开PHYSICAL STANDBY,闪回和还原测试

    以下大部分都在STANDBY执行,主库执行(两次)的会提示 [STANDBY read write方式打开测试]检查standby状态SQL> SELECT NAME,DATABASE_ROLE ...

  8. Tcp连接和断开

    三次握手:客户端为a,服务端为b:开始都是closed状态:a主动打开进入到syn_sent状态,b被动打开进入listen状态:第一次握手,a向b发送SYN=1,seq为x的包,b收到以后进入syn ...

  9. 问题解决:ImportError: No module named tensorflow

    环境: python3.5.3+pycharm2018.2EAP 问题描述: Pycharm编译报错 ImportError: No module named tensorflow 解决方法: ten ...

  10. deepin安装nginx失败记录

    问题描述 在deepin系统中,apt install nginx 返回信息报错: nginx 依赖于 nginx-full (<< 1.10.3-1+deb9u2.1~) | nginx ...