今天这篇文章为大家带来几个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()
大家好,我是老表
觉得本文不错的话,转发、留言、点赞,是对我最大的支持。
每日留言
说说你读完本文感受?
或者一句激励自己的话?
(字数不少于15字)
怎么加入刻意学习队伍
点我,看文末彩蛋
留言有啥福利
点我就知道了
想进学习交流群
加微信:jjxksa888
备注:简说Python
2小时快速掌握Python基础知识要点。
完整Python基础知识要点
Python小知识 | 这些技能你不会?(一)Python小知识 | 这些技能你不会?(二)Python小知识 | 这些技能你不会?(三)Python小知识 | 这些技能你不会?(四)近期推荐阅读:【1】整理了我开始分享学习笔记到现在超过250篇优质文章,涵盖数据分析、爬虫、机器学习等方面,别再说不知道该从哪开始,实战哪里找了【2】【终篇】Pandas中文官方文档:基础用法6(含1-5)觉得不错就点一下“在看”吧