欢迎来到雲闪世界。升级您的 Python 工具包:发现 7 个应停止使用的过时库以及替代它们的功能。最近,我回顾了 Python 的新特性,发现每个版本都引入了创新,使我们的日常开发工作变得更加轻松。
这让我意识到科技是一门永无止境的艺术,总是充满惊喜。这也提醒我要不断更新我的“工具包”,以免被新技术的浪潮抛在后面。
让我们来谈谈 Python 中的一些过时的方法以及如何拥抱这些新功能。
Pathlib 与 OS 模块
还记得使用 os.path 作为文件路径时的那些长字符串吗?那是一场噩梦。
自 Python 3.4 以来,pathlib 模块彻底改变了文件路径操作。
它就像一个金矿,使代码更加优雅和可读。
from pathlib import Path
import os.path
# Old way
two_dirs_up = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# New way, more readable
two_dirs_up = Path(__file__).resolve().parent.parent
使用新方法,路径将被视为对象,而不是字符串,从而允许通过对象属性直接操作。这是程序员的梦想。
例如,获取文件名,后缀,父目录等,可以简单地完成:
readme = Path("README.md").resolve()
print(f"Absolute path: {readme.absolute()}") # Absolute path
print(f"File name: {readme.name}") # File name
print(f"Path root: {readme.root}") # Root path
print(f"Parent directory: {readme.parent}") # Parent directory
print(f"File extension: {readme.suffix}") # File suffix
print(f"Is it absolute: {readme.is_absolute()}") # Is it an absolute path?
我最喜欢的功能是使用“/”运算符来连接路径:
etc = Path('/etc')
joined = etc / "cron.d" / "anacron"
print(f"Exists? - {joined.exists()}") # Check if the path exists
路径操作变得像“切蛋糕”一样简单直观。旧的 os.path 模块现在已经远远落后于时代。
机密与 OS 模块
让我们来讨论一下 Python 3.6 中引入的 secrets 模块。
之前我们使用 os.urandom 来生成随机字节。然而,secret 更适合生成安全令牌,尤其是密码等敏感信息。
import secrets
length = 64
value = secrets.token_bytes(length)
print(f"Bytes: {value}")
value = secrets.token_hex(length)
print(f"Hex: {value}")
使用秘密的好处是它提供了许多生成随机数据的方法,并且是出于安全目的而设计的。
与随机模块不同,应使用秘密来生成密码以确保其安全。
Zoneinfo 与 pytz
在 Python 3.9 之前,我们依靠 pytz 库进行时区处理。
现在,Python 包含 zoneinfo 模块,简化了时区操作。
from datetime import datetime
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}")
这对于处理时区来说是一个巨大的进步,但请记住,如果您的系统缺少时区数据,您仍然需要 tzdata 包。
数据类与命名元组
Python 3.7 引入了数据类,使得定义数据结构变得更加容易。
数据类可以替代命名元组,提供不可变对象、默认值和类型提示。
from dataclasses import dataclass
@dataclass
class User:
name: str
surname: str
password: bytes
u = User("John", "Doe", b'secret')
print(u)
这不仅简化了代码,还提高了可读性。除非您创建了数百万个实例,否则性能差异很小。
毕竟程序员最大的敌人是拖延症,而不是执行效率。
正确记录与打印
有时我们会使用打印语句进行调试,但在生产环境中,使用日志记录模块是更好的选择。
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("A serious error occurred.")
logging.warning('This is a warning.')
日志记录有助于更好地记录信息,并允许设置日志级别、格式等,从而增强调试体验。
f 字符串与格式
我们多久使用一次 str.format() 来连接字符串?
自从 Python 3.6 引入 f 字符串以来,字符串连接变得非常简单。
name = "world"
print(f"Hello, {name}!")
但是,f 字符串并不总是最好的选择。对于动态模板,仍然需要 str.format()。
def func(tpl: str, param1: str, param2: str) -> str:
return tpl.format(param1=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"))
f 字符串非常适合静态字符串,因此请根据您的需要在它们之间进行选择。
Tomlib 与 tomli
最后,我们来谈谈如何处理 TOML 配置文件。Python 3.11 引入了 tomllib,无需安装 tomli 库。
import tomllib
with open("pyproject.toml", "rb") as f:
config = tomllib.load(f)
print(config)
少一个依赖意味着少一些麻烦,特别是在多版本环境中。内置库总是能提供稳定感。
感谢关注雲闪世界。(Aws解决方案架构师vs开发人员&GCP解决方案架构师vs开发人员)