这几个Python库已经淘汰了,请不要再用了!

几个被淘汰的Python库,请不要再用! 随着每个 Python 版本的发布,都会添加新模块,并引入新的更好的做事方式,虽然我们都习惯了使用好的旧 Python 库和某些做事方式,但现在也时候升级并利用新的和改进的模块及其特性了。pathlib 绝对是 Python 标准库中最近添加的更大的内容之一, 自 Python 3.4 以来,它一直是标准库的一部分,但很多人仍然使用 os 模块进行文件系统操作。然而,pathlib 与旧的 os.path 相比具有许多优点 - 虽然 os 模块以原始字符串格式表示路径,但 pathlib 使用面向对象的样式 阅读详情

来源:网络

随着每个 Python 版本的发布,都会添加新模块,并引入新的更好的做事方式,虽然我们都习惯了使用好的旧 Python 库和某些做事方式,但现在也时候升级并利用新的和改进的模块及其特性了。

Pathlib 而不是 OS

pathlib 绝对是 Python 标准库中最近添加的更大的内容之一, 自 Python 3.4 以来,它一直是标准库的一部分,但很多人仍然使用 os 模块进行文件系统操作。

然而,pathlib 与旧的 os.path 相比具有许多优点 - 虽然 os 模块以原始字符串格式表示路径,但 pathlib 使用面向对象的样式,这使得它更具可读性和编写自然:

from pathlib import Path``import os.path``   ``# 老方式``two_dirs_up = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))``# 新方式,可读性强``two_dirs_up = Path(__file__).resolve().parent.parent

路径被视为对象而不是字符串这一事实也使得可以创建一次对象,然后查找其属性或对其进行操作:

readme = Path("README.md").resolve()``   ``print(f"Absolute path: {readme.absolute()}")``# Absolute path: /home/martin/some/path/README.md``print(f"File name: {readme.name}")``# File name: README.md``print(f"Path root: {readme.root}")``# Path root: /``print(f"Parent directory: {readme.parent}")``# Parent directory: /home/martin/some/path``print(f"File extension: {readme.suffix}")``# File extension: .md``print(f"Is it absolute: {readme.is_absolute()}")``# Is it absolute: True

我最喜欢 pathlib 的一个特性是可以使用 /(“除法”)运算符来连接路径:

# Operators:``etc = Path('/etc')``   ``joined = etc / "cron.d" / "anacron"``print(f"Exists? - {joined.exists()}")``# Exists? - True

重要的是要注意 pathlib 只是替代 os.path 而不是整个 os 模块, 它还包括 glob 模块的功能,因此如果你习惯于将 os.path 与 glob.glob 结合使用,那么你可以完全用pathlib替代它们。

在上面的片段中,我们展示了一些方便的路径操作和对象属性,但 pathlib 还包括你习惯于 os.path 的所有方法,例如:

print(f"Working directory: {Path.cwd()}")  # same as os.getcwd()``# Working directory: /home/martin/some/path``Path.mkdir(Path.cwd() / "new_dir", exist_ok=True)  # same as os.makedirs()``print(Path("README.md").resolve())  # same as os.path.abspath()``# /home/martin/some/path/README.md``print(Path.home())  # same as os.path.expanduser()``# /home/martin

有关 os.path 函数到 pathlib 中新函数的完整映射,请参阅 官方文档。

Secrets 而不是 OS

说到 os 模块,你应该停止使用的另一部分是 os.urandom。相反,你应该使用自 Python 3.6 以来可用的新秘密模块:

# 老方式:``import os``   ``length = 64``   ``value = os.urandom(length)``print(f"Bytes: {value}")``# Bytes: b'\xfa\xf3...\xf2\x1b\xf5\xb6'``print(f"Hex: {value.hex()}")``# Hex: faf3cc656370e31a938e7...33d9b023c3c24f1bf5``   ``# 新方式:``import secrets``   ``value = secrets.token_bytes(length)``print(f"Bytes: {value}")``# Bytes: b'U\xe9n\x87...\x85>\x04j:\xb0'``value = secrets.token_hex(length)``print(f"Hex: {value}")``# Hex: fb5dd85e7d73f7a08b8e3...4fd9f95beb08d77391

使用 os.urandom 实际上并不是这里的问题,引入secrets模块的原因是因为人们使用随机模块来生成密码等,即使随机模块不产生密码安全令牌。

根据文档,随机模块不应用于安全目的, 你应该使用 secrets 或 os.urandom,但 secrets 模块绝对更可取,因为它比较新,并且包含一些用于十六进制令牌的实用程序/便利方法以及 URL 安全令牌。

Zoneinfo 而不是 pytz

在 Python 3.9 之前,没有用于时区操作的内置库,所以每个人都在使用 pytz,但现在我们在标准库中有 zoneinfo,所以是时候切换了。

from datetime import datetime``import pytz  # pip install pytz``   ``dt = datetime(2022, 6, 4)``nyc = pytz.timezone("America/New_York")``   ``localized = nyc.localize(dt)``print(f"Datetime: {localized}, Timezone: {localized.tzname()}, TZ Info: {localized.tzinfo}")``   ``# 新方式:``from zoneinfo import ZoneInfo``   ``nyc = ZoneInfo("America/New_York")``localized = datetime(2022, 6, 4, tzinfo=nyc)``print(f"Datetime: {localized}, Timezone: {localized.tzname()}, TZ Info: {localized.tzinfo}")``# Datetime: 2022-06-04 00:00:00-04:00, Timezone: EDT, TZ Info: America/New_York

datetime 模块将所有时区操作委托给抽象基类 datetime.tzinfo, 这个抽象基类需要一个具体的实现——在引入这个很可能来自 pytz 的模块之前。现在我们在标准库中有 zoneinfo,我们可以使用它。

然而,使用 zoneinfo 有一个警告——它假定系统上有可用的时区数据,UNIX 系统就是这种情况, 如果你的系统没有时区数据,那么你应该使用 tzdata 包,它是由 CPython 核心开发人员维护的第一方库,其中包含 IANA 时区数据库。

Dataclasses

Python 3.7 的一个重要补充是 dataclasses 包,它是 namedtuple 的替代品。

你可能想知道为什么需要替换 namedtuple?以下是你应该考虑切换到数据类的一些原因:

1、它可以是可变的

2、默认提供 repr、eq、init、hash 魔术方法,

3、允许指定默认值,

4、支持继承。此外,数据类还支持 frozen 和 slots(从 3.10 开始)属性以提供与命名元组的特征奇偶校验。

切换真的不应该太难,因为你只需要更改定义:

# 老方式:``# from collections import namedtuple``from typing import NamedTuple``import sys``   ``User = NamedTuple("User", [("name", str), ("surname", str), ("password", bytes)])``   ``u = User("John", "Doe", b'tfeL+uD...\xd2')``print(f"Size: {sys.getsizeof(u)}")``# Size: 64``   ``# 新方式:``from dataclasses import dataclass``   ``@dataclass()``class User:`   `name: str`   `surname: str`   `password: bytes``   ``u = User("John", "Doe", b'tfeL+uD...\xd2')``   ``print(u)``# User(name='John', surname='Doe', password=b'tfeL+uD...\xd2')``   ``print(f"Size: {sys.getsizeof(u)}, {sys.getsizeof(u) + sys.getsizeof(vars(u))}")``# Size: 48, 152

在上面的代码中,我们还包含了大小比较,因为这是 namedtuple 和数据类之间的较大差异之一,如上所见,命名元组的大小要小得多,这是由于数据类使用 dict 来表示属性。

至于速度比较,除非你计划创建数百万个实例,否则属性的访问时间应该基本相同,或者不够重要:

import timeit``   ``setup = '''``from typing import NamedTuple``User = NamedTuple("User", [("name", str), ("surname", str), ("password", bytes)])``u = User("John", "Doe", b'')``'''``   ``print(f"Access speed: {min(timeit.repeat('u.name', setup=setup, number=10000000))}")``# Access speed: 0.16838401100540068``   ``setup = '''``from dataclasses import dataclass``   ``@dataclass(slots=True)``class User:`  `name: str`  `surname: str`  `password: bytes``   ``u = User("John", "Doe", b'')``'''``   ``print(f"Access speed: {min(timeit.repeat('u.name', setup=setup, number=10000000))}")``# Access speed: 0.17728697300481144

如果以上内容说服了你打算切换到数据类,请尽快尝试吧

相反,如果你不想切换并且出于某种原因真的想使用命名元组,那么你至少应该使用键入模块而不是collections中的 NamedTuple:

# 不好方式的:``from collections import namedtuple``Point = namedtuple("Point", ["x", "y"])``   ``# 更好的方式:``from typing import NamedTuple``class Point(NamedTuple):`    `x: float`    `y: float

最后,如果你既不使用 namedtuple 也不使用数据类,你可能需要考虑直接使用 Pydantic。

Proper Logging 而不是 print

这不是标准库的最新添加,但值得使用 - 你应该使用正确的日志记录而不是打印语句, 如果你在本地调试问题,则可以使用 print,但对于任何无需用户干预即可运行的生产就绪程序,正确的日志记录是必须的。

特别是考虑到设置 Python 日志记录非常简单:

import logging``logging.basicConfig(`    `filename='application.log',`    `level=logging.WARNING,`    `format='[%(asctime)s] {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s',`    `datefmt='%H:%M:%S'``)``   ``logging.error("Some serious error occurred.")``# [12:52:35] {<stdin>:1} ERROR - Some serious error occurred.``logging.warning('Some warning.')``# [12:52:35] {<stdin>:1} WARNING - Some warning.

与打印语句相比,上面的简单配置将为你提供卓越的调试体验, 最重要的是,你可以进一步自定义日志库以记录到不同的位置、更改日志级别、自动轮换日志等。

f-strings 而不是 format

Python 包含很多格式化字符串的方法,包括 C 样式格式化、f 字符串、模板字符串或 .format 函数, 不过,其中之一 - f-strings - 格式化的字符串文字 , 它们写起来更自然,可读性更强,并且是前面提到的选项中最快的。

因此,我认为没有必要争论或解释为什么要使用它们,然而,在某些情况下不能使用 f 字符串:

使用 % 格式的唯一原因是用于记录:

import logging``   ``things = "something happened..."``   ``logger = logging.getLogger(__name__)``logger.error("Message: %s", things)  # 评估内部记录器方法``logger.error(f"Message: {things}")  # 立即评估

在上面的示例中,如果你使用 f 字符串,则表达式将立即计算,而使用 C 样式格式,替换将被推迟到实际需要时,这对于消息分组很重要,其中具有相同模板的所有消息都可以记录为一个, 这不适用于 f 字符串,因为模板在传递给记录器之前填充了数据。

此外,有些事情是 f-strings 根本无法做到的, 例如在运行时填充模板 - 即动态格式 - 这就是 f-strings 被称为文字字符串格式的原因:

# 动态设置模板及其参数``def func(tpl: str, param1: str, param2: str) -> str:`    `return tpl.format(param=param1, param2=param2)``   ``some_template = "First template: {param1}, {param2}"``another_template = "Other template: {param1} and {param2}"``print(func(some_template, "Hello", "World"))``print(func(another_template, "Hello", "Python"))``   ``# 动态重用具有不同参数的相同模板.``inputs = ["Hello", "World", "!"]``template = "Here's some dynamic value: {value}"``   ``for value in inputs:`    `print(template.format(value=value))

最重要的是,尽可能使用 f 字符串,因为它们更具可读性和更高性能,但请注意,在某些情况下仍然首选和/或需要其他格式样式。

Tomllib 而不是 tomli

TOML 是一种广泛使用的配置格式,对于 Python 的工具和生态系统尤其重要,因为它用于 pyproject.toml 配置文件, 到目前为止,你必须使用外部库来管理 TOML 文件,但是从 Python 3.11 开始,将有一个名为 tomllib 的内置库,它基于 toml 包。

所以,一旦你切换到 Python 3.11,你应该养成使用 import tomllib 而不是 import tomli 的习惯。少了一种需要担心的依赖!

# import tomli as tomllib``import tomllib``   ``with open("pyproject.toml", "rb") as f:`    `config = tomllib.load(f)`    `print(config)`    `# {'project': {'authors': [{'email': 'contact@martinheinz.dev',`    `#                           'name': 'Martin Heinz'}],`    `#              'dependencies': ['flask', 'requests'],`    `#              'description': 'Example Package',`    `#              'name': 'some-app',`    `#              'version': '0.1.0'}}``   ``toml_string = """``[project]``name = "another-app"``description = "Example Package"``version = "0.1.1"``"""``   ``config = tomllib.loads(toml_string)``print(config)``# {'project': {'name': 'another-app', 'description': 'Example Package', 'version': '0.1.1'}}

Setuptools 而不是 distutils

最后一个更像是弃用通知:

由于 Distutils 已弃用,因此同样不鼓励使用任何来自 distutils 的函数或对象,Setuptools 旨在替换或弃用所有此类用途。

是时候告别 distutils 包并切换到 setuptools 了,setuptools 文档提供了有关如何替换 distutils 用法的指导, 除此之外,PEP 632 还为 setuptools 未涵盖的部分 distutils 提供迁移建议。

以上就是“这几个Python库已经淘汰了,请不要再用了!”的全部内容,希望对你有所帮助。
​
​关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

在这里插入图片描述

二、Python必备开发工具

img

三、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

五、Python练习题

检查学习结果。

img

六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

img

最后祝大家天天进步!!

上面这份完整版的Python全套学习资料已经上传至优快云官方,朋友如果需要可以直接微信扫描下方优快云官方认证二维码免费领取【保证100%免费】。

LilyPad三色LED共阳极控制:从原理到Arduino编程实战 RGB LED作为可编程光源的核心组件,通过红、绿、蓝三原色的加色混合原理,能够生成丰富的色彩。其内部结构主要分为共阳极和共阴极两种类型,这决定了驱动电路的设计和编程逻辑。在电子织物和可穿戴设备领域,掌握RGB LED的控制技术对于实现动态光效和交互反馈至关重要。本文以LilyPad三色LED为例,深入解析其共阳极特性,并详细演示如何结合Arduino进行PWM编程,从而精准控制颜色与亮度,为智能服装、互动艺术装置等项目提供可靠的照明解决方案。 阅读详情

相关推荐

SAP开发实战:用FI_DOCUMENT_CHANGE BAPI批量修改FB03凭证抬头和行项目文本(附完整ABAP代码)

本文详细介绍了如何使用SAP的FI_DOCUMENT_CHANGE BAPI批量修改FB03凭证抬头和行项目文本,提供完整的ABAP代码实现方案。通过该BAPI,开发者可以高效完成财务凭证的批量修改,确保数据一致性和审计合规性,显著提升SAP财务模块的运维效率。

weixin_29224589的博客 381

【Python】速度起飞!替代 pandas 的 8 个神库

之前介绍过不少关于pandas性能加速的技巧,但这些技巧再厉害,整体运行速度方面也会遇到瓶颈。再见 for 循环!速度提升315倍!Pandas、Numpy性能优化秘籍(全)本篇介绍 8 个可以替代pandas的库,在加速技巧之上,再次打开速度瓶颈,大大提升数据处理的效率。1. DaskDask在大于内存的数据集上提供多核和分布式并行执行。在Dask中,一个DataFra...

fengdu78的博客 3515

使用openair包分析气象数据

气象数据通常是有规律的时间序列,分析气象数据时需要对空气质量测量、气象数据和扩散模型输出进行分析。openair 是用于分析空气质量数据或更广泛的大气成分数据的R软件包。该软件包广泛应用于学术界、公共和私营部门。该项目最初由英国自然环境研究委员会(NERC)资助,并由英国环境部(Defra)提供额外资金。

Christina 2519

python 3.4 替代 distutils.dir_util.copy_tree 的方法

【代码】 distutils.dir_util.copy_tree 替代方案

k_this42的博客 796

STM32开发实战--解决STM32CubeMX生成代码时钟初始化卡死问题

本文详细分析了STM32CubeMX生成代码在时钟初始化阶段卡死的问题,提供了多种解决方案,包括简单修改和稳健的等待机制。通过深入探讨HAL库的时钟初始化陷阱及硬件层面的根本原因,帮助开发者快速定位并解决STM32开发中的常见问题。

weixin_26965807的博客 441

C# Winform使用Monaco打造代码编辑器

本文介绍了如何在Winform项目中集成Monaco代码编辑器。通过NuGet安装WebView2控件,创建monaco-editor.html文件加载编辑器,并实现与C#代码的交互。关键步骤包括:初始化WebView2环境、配置Monaco编辑器参数、设置代码变更监听事件以及处理C#与JavaScript之间的通信。注意事项提示了依赖库安装问题的解决方法。该方案实现了功能完整的代码编辑器,支持代码自动保存和实时显示功能。

遇见--专栏 346

替代Selenium,实现异步抓取,新神器Pyppeteer操作更简单!

作者 | 崔庆才来源 | 进击的Coder(id:FightingCoder)编辑 | Jane【导读】Selenium 库是一个自动化测试工具,很多人可能对它并不陌生...

Python大本营的博客 1万+

【滚雪球学数学建模】第4.1节·概率与统计建模,一文搞懂!

🎓 本文收录于 《滚雪球学数学建模》专栏,本专栏专注于从零基础出发,带你循序渐进掌握数学建模的核心方法与思维路径。通过“滚雪球式”学习法,从最简单的生活化案例到经典建模工具,再到省赛、国赛真题实战演练,逐步积累知识与技能,帮助你搭建完整的建模体系。无论你是刚接触建模的新生,还是希望提升科研与竞赛能力的学者与工程师,本专栏都将为你提供一条清晰、高效、可实操的建模成长路线,助力你快速进阶,突破难点,迈向数学建模竞赛与实际应用的更高峰 🚀!

**My Coding Family** 1349

Pandas统计分析中(数据计算、数据格式化、数据分组统计、数据移位、数据转换、数据合并、数据导出)

Pandas统计分析

Triumph19的博客 5321

uniapp [全端兼容] - 实现接入使用天地图及卫星视图切换功能,在国家天地图上自由切换地图显示类型(卫星视图/地形视图/卫星混合/地形混合/普通视图)天地图切换视图显示改成卫星风格,切换地图图层

uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,天地图,视图,卫星,地图类型切换,uniAPP天地图,改成卫星视角,在线地图切换,来回切换卫星图,天地图如何实现来回切换卫星图,地形图,卫星视图,VUE3引入天地图卫星版,详细教程示例源码代码,天地图切换卫星用什么api,卫星视角API方法,vue3卫星天地图,能改地图的显示方式,vue3中使用天地图自定义样式切换地图图层,切换报错,加载出错,卫星图太卡,地图图层更换,vue3安装集成天地图详细示例源

🏆 前端领域优质创作者 1万+

将物理信息神经网络(PINN)应用于微通道湍流的拓扑优化,并结合COMSOL数据进行训练与快速预测

本文提出一种基于物理信息神经网络(PINN)的微通道散热器流场快速预测方法。通过有限组COMSOL仿真数据训练神经网络,结合Navier-Stokes方程和能量方程作为物理约束,构建可快速预测新拓扑结构下速度场和温度场的替代模型。该方法包含数据准备、网络构建、损失函数设计等关键步骤,利用自动微分计算方程残差,显著降低传统CFD优化的计算成本,实现秒级/分钟级的流场预测,为微通道散热器拓扑优化提供高效解决方案。

huanghm88的专栏 536

python包介绍:GeoPandas(初识)

1 GeoPandas介绍 GeoPandas是一个开源项目,可以更轻松地使用python处理地理空间数据。 GeoPandas扩展了Pandas中使用的数据类型DataFrame,允许对几何类型进行空间操作。 GeoPandas的目标是使在python中使用地理空间数据更容易。它结合了Pandas和Shapely的能力,提供了Pandas的地理空间操作和多种Shapely的高级接口。GeoPandas可以让您轻松地在python中进行操作,否则将需要...

qq_40206371的博客 2万+

Python 爬虫实战:豆瓣电影海报批量获取(Top250 榜单 + 可视化展示)

在信息爆炸的时代,数据已成为决策的核心,而数据的获取是数据分析的第一步。本文将详细介绍如何利用 Python 爬虫获取豆瓣电影 Top250 榜单的海报,并对数据进行可视化展示,助你更好地了解电影市场的趋势和用户的喜好。

yansideyucsdn的博客 718

这几个被淘汰的Python库,请不要再用!

每个新的 Python 版本都会带来新的特性,因此我建议你查看 Python 发行说明中的“新模块”、“不推荐使用的模块”和“已删除的模块”部分,这是了解 Python 标准重大变化的好方法 , 通过这种方式,你可以不断地将新功能和最佳实践整合到你的项目中。

具身机器人和通用AI 1025

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

几个被淘汰的 Python 库,请不要再用!

每个新的 Python 版本都会带来新的特性,因此我建议你查看 Python 发行说明中的“新模块”、“不推荐使用的模块”和“已删除的模块”部分,这是了解 Python 标准重大变化的好方法 , 通过这种方式,你可以不断地将新功能和最佳实践整合到你的项目中。

Trb201013的博客 936

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

几个被淘汰的Python库,请不要再用!

这几个被淘汰的Python库,有库能够完美代替,快来看看吧

m0_48891301的博客 775

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

上一篇: 50个Pandas高级操作,必读!
下一篇: 用Python写了个绝地求生(附源码)
壹只小小码农
博客等级 码龄5年 8101粉丝 1334原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值