Предупреждение использования под питона
Потому что это то, когда я использую SQL модуль оператора pymysql выполнить построение таблицы выиграно, в выходном сообщении красной консоли, но программа не завершается, но продолжает побегать
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)
Проблема будет решена, как обсессивно нужно смотреть углубленное исследование, следующие выводы:
предупреждение модуля, два основных метода
1.warn
该方法用于输出一个警告信息
#参数一: message 表示警告的详细信息
#参数二: category 类别,需要一个类作为参数,该类必须是Warning的子类,Warning类是Exception的子类,用于给警告设置一个具体的类型
#参数三: stacklevel 指定调用栈的层级,用于确定要从哪一级获取行号
#参数四: 没研究
stacklevel в исходном коде вызова:
Код, чтобы получить кадр, для получения номера строки
Это Получает номер строки исходного кода может быть больше, чем немного навыков, чтобы получить
питон Возвращает номер строки:
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)
Самым большим преимуществом этого метода является то, что, независимо от того, сколько метод инициализации параметров требует назначение не может, вероятно, назвать их, и больше параметров инициализации для класса очень дружелюбным;
Принцип заключается в том, чтобы получить функцию локальных переменных с помощью местных жителей () словарной формы, а затем пройти через словарь, после исключения других устанавливается самостоятельно атрибуты личности, с именем параметра, как знакомое имя, что значительно снижает повторение грозди присвоение кода!
В противном случае, ваш код может выглядеть следующим образом:
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)
Если параметр особенный, чем много слов, вы знаете ......