
这周在读者群里做了个小调查,问大家最近在用啥好用的Python库。
结果炸出来一堆推荐,有几个我试了之后直接拍大腿——这也太香了吧。
今天就把这5个反馈最多的库整理出来,每个都带真实使用场景和踩过的坑。
以前我写循环从来不加进度条,直到有一次跑了3小时的爬虫,中途不知道卡住还是正常执行,人都麻了。
fromtqdmimporttqdm
importtime
# 以前这样写
foriinrange(1000):
# 业务逻辑
time.sleep(0.01)
# 现在这样写
foriintqdm(range(1000), desc="下载中"):
time.sleep(0.01)就多了两行代码,命令行里直接显示进度条、预估剩余时间、下载速度。
读者@阿杰的吐槽:
我之前跑机器学习训练,跑了2个小时不知道进度,加了tqdm之后才发现原来epoch 50/100就卡住了,后来排查出是数据加载的问题。
进阶用法:
fromtqdmimporttqdm
importrandom
pbar = tqdm(total=100, desc="处理中",
bar_format="{l_bar}{bar}| {n_fmt}/{total_fmt} [{elapsed}<{remaining}]")
foriinrange(100):
time.sleep(random.uniform(0.01, 0.05))
pbar.update(1)
pbar.close()之前写API参数验证,全靠if-else写到手抽筋:
# 以前的写法
defcreate_user(name, age, email):
ifnotisinstance(name, str):
raiseValueError("name必须是字符串")
ifnotisinstance(age, int):
raiseValueError("age必须是整数")
ifage<0orage>150:
raiseValueError("age范围不对")
if"@"notinemail:
raiseValueError("email格式不对")
# 业务逻辑...换了Pydantic,20行变3行:
frompydanticimportBaseModel, EmailStr, Field
fromtypingimportOptional
classUser(BaseModel):
name: str = Field(..., min_length=1, max_length=50)
age: int = Field(..., ge=0, le=150)
email: EmailStr
bio: Optional[str] = None
# 直接用,自动验证
user = User(name="小明", age=25, email="xiaoming@example.com")读者@技术小张的血泪教训:
之前用dict传参,用户传个字符串“25”当age,后端没做类型转换直接存了,数据库字段是int,查数据的时候出各种莫名其妙的问题。换了pydantic,从源头卡死,爱传错类型?门都没有。
Settings配置也很好用:
frompydantic_settingsimportBaseSettings
classConfig(BaseSettings):
database_url: str
api_key: str
debug: bool = False
classConfig:
env_file = ".env"
config = Config() # 自动从环境变量读取如果你还在用print输出日志,我劝你试试这个。
fromrich.consoleimportConsole
fromrich.tableimportTable
console = Console()
# 带颜色和样式的输出
console.print("[bold red]错误![/bold red] 文件不存在")
console.print("[green]成功[/green] 连接数据库")
# 表格直接帮你画好
table = Table(title="性能对比")
table.add_column("库", style="cyan")
table.add_column("速度", style="magenta")
table.add_column("易用性", style="green")
table.add_row("A库", "100ms", "⭐⭐⭐")
table.add_row("B库", "50ms", "⭐⭐")
table.add_row("Rich", "30ms", "⭐⭐⭐⭐⭐")
console.print(table)读者@运维小李的真实反馈:
我写的CLI工具之前输出全是白底黑字,用户说根本看不清。用了Rich之后,同事问我是不是换了套UI框架。(笑)
调试神器:
fromrichimportprintasrprint
fromrich.prettyimportpprint
data = {"name": "测试", "users": [{"id": 1, "name": "张三"}, {"id": 2, "name": "李四"}]}
pprint(data) # 自动美化JSON输出,带缩进和颜色Python的logging模块配置起来有多反人类,用过的都知道。
Loguru直接给你默认就很好用:
fromloguruimportlogger
logger.debug("调试信息")
logger.info("普通信息")
logger.success("成功信息")
logger.warning("警告信息")
logger.error("错误信息")
# 写文件也简单
logger.add("app.log", rotation="500 MB", retention="10 days")
# 异常捕获自带堆栈
@logger.catch
defrisky_function():
# 可能出错的地方
pass读者@全栈小王的吐槽:
之前每次写新项目,光logging配置就要写半小时。换了Loguru之后,一行import直接开干,默认输出带颜色和时间的,比我手写的配置好看多了。
配合异常追踪:
fromloguruimportlogger
importtraceback
defmain():
try:
result = 1/0
exceptException:
logger.exception("出错了!") # 自动记录完整堆栈
logger.error(f"详细错误: {traceback.format_exc()}")之前写热更新功能,Linux用inotify好好的,Windows直接傻眼。
现在一个库搞定跨平台:
importwatchfiles
# 监控当前目录的py文件变化
forchangesinwatchfiles.watch("./src"):
print("检测到变化:", changes)
# 这里触发重启服务/重新加载配置Flask热更新示例:
fromwatchfilesimportwatch
fromflaskimportFlask
importsubprocess
app = Flask(__name__)
@app.route("/")
defhello():
return"Hello World!"
defrestart_server():
subprocess.run(["python", "app.py"])
if__name__ == "__main__":
# 监控src目录,有变化就重启
for_inwatch("src", step=5000):
print("检测到代码变化,正在重启...")
restart_server()读者@独立开发者阿强的经验:
我写Flask项目之前每次改代码都要手动重启,加了这个之后改完保存浏览器刷新就行,效率提升明显。不过注意别在重启逻辑里又触发watch,不然会死循环。(别问我是怎么知道的)
这5个库用了就回不去:
群里推荐的时候我还半信半疑,试了之后发现Rich和Loguru这两个改完确实舒服很多。
你们还有啥好用的库推荐?评论区聊聊!
“无他,惟手熟尔”!有需要的用起来!
本文分享自 Nicholas与Pypi 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!