错误类型
- 语法错误
SyntaxError: EOL while scanning string literal
看着syntaxerror就是语法错误
AttributeError:属性异常
- 语义错误
- 逻辑错误
- 找到错误
try后面输入可能有异常的程序
遇到错误就打印,except后面跟可能出错的类型,如果没有跟,所有错误都会打印
# try后面输入可能有异常的程序
try:
x = 5 / 2
print(x)
# 遇到错误就打印,except后面跟可能出错的类型,如果没有跟,所有错误都会打印
except ZeroDivisionError as e:
print('不能除零',e)
except:
print('程序遇到错误')
else:
print('没有异常')
异常处理
try: 有可能出现异常代码
except:异常类型as 实例:捕获特定异常
else:未遇到异常
finally:不论是否遇到异常均会执行
raise:手动抛出异常
import unittest
class Coder:
def __init__(self, name):
self.name = name
self.skills = []
def mastering_skill(self, skill):
self.skills.append(skill)
def show_skills(self):
print('掌握技能:')
for skill in self.skills:
print('-', 'skill')
class CoderTestCase(unittest.TestCase):
def test_skill_in(self):
c = Coder('Tom')
c.mastering_skill('Python')
c.mastering_skill('C++')
self.assertIn('Python',c.skills)
if __name__ == "__main__":
unittest.main()
测试一个类需要导入unittest模块,掌握一下assert板块。具体内容还需要摸索。
单元测试
在代码交付之前,需要对代码的功能进行测试,观察功能是否完备
基本结构
例子:测试一下加法和减法
class_exercise.py
def add(a, b):
return a + b
def substract(a, b):
return a - b
mytest.py
import unittest
from new_class_.class_exercise import add
from new_class_.class_exercise import substract
class Mytest(unittest.TestCase):
def test_add(self):
self.assertEqual(9, add(5, 3))
def test_substract(self):
self.assertEqual(2, substract(5, 3))
if __name__ == '__main__':
unittest.main()
class Mytest(unittest.TestCase):
这个是必须导入unittest.TestCase
这个包,下面定义以
def test_
开头,表示测试,最后以
if __name__ == '__main__':
unittest.main()
收尾。
断言的类型
import unittest
person = {'name': "Mike", 'age': 20}
numbers = [1, 2, 3, 4, 5, 13, 88]
s = 'DIqu leshan'
class TestAssert(unittest.TestCase):
def test_assert_method(self):
# 判断值是否相等
# self.assertEqual('Mike', person.get('name'))
# 判断是否为真
# self.assertTrue('leshan' in s)
# 判断是否包含
# self.assertIn('leshan', s)
# 判断是否约等于
# self.assertAlmostEqual(3.3, 1.1 + 2.2)
# 判断Id值是否相等
# self.assertIs(True + 1, 2)
# 判断是否为空
# self.assertIsNone(person.get('Name', None))
# 判断是否为每个变量的实例
# self.assertIsInstance(s, str)
# 判断是否大于
# self.assertGreater(2,3)
if __name__ == '__main__':
unittest.main()
简化版本
import unittest
from new_class_.class_exercise import Calculator
class CalculatorTest(unittest.TestCase):
def setUp(self):
self.c = Calculator(5, 3)
def test_Add(self):
self.assertEqual(8, self.c.add())
def tearDown(self):
del self.c
if __name__ == '__main__':
unittest.main()
容易踩的坑
- 如何简单的理解Python中的if name == 'main’
通俗的理解__name__ == '__main__':
假如你叫小明.py,在朋友眼中,你是小明(__name__ == '小明');
在你自己眼中,你是你自己(__name__ == '__main__')
。
if __name__ == '__main__'
的意思是:当 .py文件被直接运行时,if __name__ == '__main__'
之下的代码块将被运行;当.py文件以模块形式被导入时,if __name__ == '__main__'
之下的代码块不被运行。
- 踩过的坑:导入的时候导入错误,为什么?
这样就报错了,必须写成
为什么呢
- 为什么每个文件夹下面的__init__文件都删不掉?
一个包是一个带有特殊文件 init.py 的目录。init.py 文件定义了包的属性和方法。其实它可以什么也不定义;可以只
是一个空文件,但是必须存在。如果 init.py 不存在,这个目录就仅仅是一个目录,而不是一个包,它就不能被导入或者包含其它的模块和嵌套包。
参考博客