Python的一些使用技巧和有趣的库
1. dataclasses
python3.7引入的内置库,实现数据类,可以利用上内置的类型提示
使用方法:
import dataclasses as dc
@dc.dataclass
class Person:
name: str # 简单说明类型
age: int = 0 # 设置默认值
sex: str = dc.field(default='male', repr=False) # 除了默认值,还可通过repr设置是否显示在字符串输出中
# 创建一个Person实例
p1 = Person('zhangyan', 25, 'female')
print(p1) # Person(name='zhangyan', age=25, sex='female')
还可以通过asdict和astuple将其转换为dict和tuple类型:
print(dc.asdict(p1)) # {'name': 'zhangyan', 'age': 25, 'sex': 'female'}
print(dc.astuple(p1)) # ('zhangyan', 25, female)
dict类型转为dataclass
p2 = {'name': 'zhangyan', 'age': 25, 'sex': 'female'}
print(Person(**p2)) # Person(name='zhangyan', age=25, sex='female')
2. namedtuple
给元组命名,元组中的每一项也可以命名;
创建的元组实例内的值是不能更改的,但可以使用_replace()方法更改值后返回一个新的元组;
也可以当作一行代码定义一个类;
也可以当作数据类用,但是无法使用内置的类型提示,不如dataclasses。
使用方法:
from collections import namedtuple
Color = namedtuple('Color', 'r g b a', defaults=[1.0]) # 'r g b a'还可以写为'r, g, b, a'或['r', 'g', 'b', 'a']
red = Color(255, 0, 0) # 红色
green = Color(0, 255, 0) # 绿色
blue = Color(0, 0, 255) # 蓝色
half_blue = Color(0, 0, 255, 0.5) # 透明度为50%的蓝色
print(half_blue) # Color(r=0, g=0, b=255, a=0.5)
half_blue = half_blue._replace(g=233)
print(half_blue)
orange = Color._make([224, 142, 0, 1]) # 使用_make函数通过传入一个可迭代对象来构建实例,设置了默认值的项依旧不能省略
print(orange)
print(orange._asdict()) # OrderedDict([('r', 224), ('g', 142), ('b', 0), ('a', 1)])
print(tuple(orange)) # (224, 142, 0, 1)
3. threading
实现类似 JavaScript 中的 setimeout 延迟运行的效果
使用方法:
import threading
def settimeout(func, delay, *args, **kwargs):
threading.Timer(delay, func, args, kwargs).start()
# 隔一秒输出一个 i,依次为 0 1 2 3 4
for i in range(5):
settimeout(lambda x: print(x), i + 1, i)
# 隔一秒输出一个 i,依次为 4 4 4 4 4
for i in range(5):
settimeout(lambda x: print(i), i + 1, i)
# 一秒后一起输出,依次为 44444
for i in range(5):
settimeout(lambda x: print(i, end=''), 1, i)
# 一秒后一起输出,顺序随机,例如:43201、12340
for i in range(5):
settimeout(lambda x: print(x, end=''), 1, i)
4. logging
实现日志功能,可以设置显示级别以及保存到日志文件
使用方法:
import logging
# 配置logging默认参数
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 获取logger
logger = logging.getLogger(__name__)
# 设置logger级别,级别顺序:DEBUG -> INFO -> WARNING -> ERROR
logger.setLevel(level=logging.DEBUG)
# 获取保存日志文件的handler
handler = logging.FileHandler('log.txt')
# 设置handler级别
handler.setLevel(logging.INFO)
# 获取formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 给handler设置formatter
handler.setFormatter(formatter)
# 给logger添加handler
logger.addHandler(handler)
# 执行一些测试
logger.info('start print log')
logger.debug('do something')
logger.warning('something maybe fail')
logger.info('finish')