今天这篇文章为大家带来几个Python使用的小技巧:
- 快速生成依赖文件
- 文件路径处理
- 通过set将对象去重
- 单元测试unitest捕获异常
快速生成依赖文件
Python通过requirements.txt来管理项目所依赖的库,通过pip install -r requirements.txt命令可以直接安装项目所需要的依赖文件。
常见的requirements.txt生成方法由两种
- 原生pip工具pip freeze > requirements.txt,这种方法会将当前环境中所安装的库全部导出,即使你在项目中没有使用,只是之前实验时安装的依赖库。
- 第三方工具pipreqs requirements.txt --encoding=utf-8,该工具使用前需要安装pip install pipreqs,pipreqs的优点它会扫描项目的依赖,只导出使用的依赖;pipreqs还可以指定扫描目录pipreqs ./ --encoding=utf-8。
文件路径处理
Python中常见的文件路径处理方式是通过os.path进行处理。
1In[2]:?import?os
2#?获取当前目录的绝对路径
3In[3]:?os.path.abspath('./')
4Out[3]:?'D:\\Work\\CommonTools'
5#?进行路径拼接
6In[4]:?os.path.join(os.path.abspath('./'),'new_file.py')
7Out[4]:?'D:\\Work\\CommonTools\\new_file.py'
8#?获取父目录
9In[5]:?os.path.abspath(os.path.dirname(os.getcwd()))
10Out[5]:?'D:\\Work'
11#?获取文件后缀名
12In[6]:?os.path.splitext('new_file.py')[-1]
13Out[6]:?'.py'
os.path处理文件路径时,比较复杂、难用,因此可以使用pathlib替代os.path。
1In[2]:?import?pathlib
2#?获取当前目录的绝对路径
3In[3]:?path?=?pathlib.Path('./')
4In[4]:?path=path.absolute()
5In[5]:?path.as_posix()
6Out[5]:?'D:/Work/CommonTools'
7#?进行路径拼接
8In[6]:?file_path?=?path?/?'new_file.py'
9In[7]:?file_path.as_posix()
10Out[7]:?'D:/Work/CommonTools/new_file.py'
11#?获取父目录
12In[8]:?path.parent
13Out[8]:?WindowsPath('D:/Work')
14#?获取文件后缀名
15In[9]:?file_path.suffix
16Out[9]:?'.py'
17#?列出当前目录下的py文件
18In[13]:?list(path.glob('*.py'))
19Out[13]:?[WindowsPath('D:/Work/CommonTools/tools.py')]
更多os.pah库和pathlib库的方法对照,请查看官方文档。
通过set将对象去重
通过set将对象去重要求对象必须实现三个方法:
- eq:判断两个对象是否相等。
- ne:判断两个对象是否不等。
- hash:生成对象的hash值。
set内部可以视作为字典,以对象的hash值作为键,通过hash来判断对象是否重复。但是hash值可能出现冲突,因此还需在hash值相同时,对比两个对象是否相等,这也是为什么需要实现这三个方法的原因。
1In[2]:?class?Person(object):
2???...:????def?__init__(self,?name,?age):
3???...:????????self._name?=?name
4???...:????????self._age?=?age
5???...:
6???...:????def?__eq__(self,?other):
7???...:????????if?isinstance(other,?Person):
8???...:????????????return?(self._name?==?other._name)?and?(self._age?==?other._age)
9???...:????????else:
10???...:????????????return?False
11???...:
12???...:????def?__ne__(self,?other):
13???...:????????return?not?self.__eq__(other)
14???...:
15???...:????def?__hash__(self):
16???...:????????return?hash(self._name?+?str(self._age))
17???...:
18???...:????def?__repr__(self):
19???...:????????return?f'{self._name}:{self._age}'
20???...:????
21In[3]:?p1?=?Person('martin',?24)
22???...:p2?=?Person('martin',?24)
23In[4]:?set([p1,?p2])
24Out[4]:?{martin:24}
25In[5]:?p2?=?Person('martin',?25)
26In[6]:?set([p1,?p2])
27Out[6]:?{martin:24,?martin:25}
单元测试unitest捕获异常
单元测试unitest中提供了两个方法用于捕获异常,判断异常信息是否符合预期:
- assertRaises():只支持指定异常判断。
- assertRaisesRegex(异常类型,异常信息正则表达式,测试方法,参数):支持匹配异常信息。
1import?unittest
2
3def?divide_exactly(a,?b):
4????return?a?//?b
5
6class?MyTestCase(unittest.TestCase):
7????def?test_division(self):
8????????self.assertEqual(divide_exactly(6,?6),?1)
9
10????????#?捕获指定异常
11????????self.assertRaises(ZeroDivisionError,?divide_exactly,?5,?0)
12????????#?可以作为上下文管理器使用
13????????with?self.assertRaises(ZeroDivisionError):
14????????????divide_exactly(5,?0)
15
16????????#?捕获指定异常
17????????self.assertRaisesRegex(ZeroDivisionError,?'integer?division?or?modulo?by?zero',?divide_exactly,?5,?0)
18????????#?可以作为上下文管理器使用
19????????with?self.assertRaisesRegex(ZeroDivisionError,?'integer?division?or?modulo?by?zero'):
20????????????divide_exactly(5,?0)
21
22
23if?__name__?==?'__main__':
24????unittest.main()
如果你还是迷茫到底如何系统的学习Python,没关系!今天分享的干货一定能帮助到你的问题。
小编精心为大家整理了Python视频教程,让你不用再纠结。
领取方式:
如果想获取这些学习资料,先关注我然后私信小编“01”即可免费领取!(私信方法:点击我头像进我主页有个上面有个私信按钮)
如果这篇文章对你有帮助,请记得给我来个评论+转发