您现在的位置是:首页 > 文章详情

又有几个Python小技巧分享

日期:2020-02-15点击:585

云栖号:https://yqh.aliyun.com
第一手的上云资讯,不同行业精选的上云企业案例库,基于众多成功案例萃取而成的最佳实践,助力您上云决策!

今天这篇文章为大家带来几个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()

云栖号:https://yqh.aliyun.com
第一手的上云资讯,不同行业精选的上云企业案例库,基于众多成功案例萃取而成的最佳实践,助力您上云决策!

原文发布时间:2020-02-11
本文作者:有只猪在飞
本文来自:“简说Python公众号”,了解相关信息可以关注“简说Python

原文链接:https://yq.aliyun.com/articles/744986
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章