你应该停止使用的 7 个已弃用的 Python 库

134 阅读4分钟

添加图片注释,不超过 140 字(可选)

欢迎来到雲闪世界。升级您的 Python 工具包:发现 7 个应停止使用的过时库以及替代它们的功能。

最近,我回顾了 Python 的新特性,发现每个版本都引入了创新,使我们的日常开发工作变得更加轻松。

这让我意识到科技是一门永无止境的艺术,总是充满惊喜。这也提醒我要不断更新我的“工具包”,以免被新技术的浪潮抛在后面。

让我们来谈谈 Python 中的一些过时的方法以及如何拥抱这些新功能。

Pathlib 与 OS 模块

还记得使用 os.path 作为文件路径时的那些长字符串吗?那是一场噩梦。

自 Python 3.4 以来,pathlib 模块彻底改变了文件路径操作。

它就像一个金矿,使代码更加优雅和可读。

从pathlib导入Path
导入 o ​​s.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"绝对路径:{readme.absolute()} " )   # 绝对路径
print ( f"文件名:{readme.name} " )             # 文件名
print ( f"路径根:{readme.root} " )             # 根路径
print ( f"父目录:{readme.parent} " )    # 父目录
print ( f"文件扩展名:{readme.suffix} " )      # 文件后缀
print ( f"是否是绝对路径:{readme.is_absolute()} " )   # 是否是绝对路径?

我最喜欢的功能是使用“/”运算符来连接路径:

etc = Path( '/etc' ) 

join = etc / "cron.d" / "anacron" 
print ( f"Exists? - {joined.exists()} " )   # 检查路径是否存在

路径操作变得像“切蛋糕”一样简单直观。旧的 os.path 模块现在已经远远落后于时代。

机密与 OS 模块

让我们来讨论一下 Python 3.6 中引入的 secrets 模块。

之前我们使用 os.urandom 来生成随机字节。然而,secret 更适合生成安全令牌,尤其是密码等敏感信息。

导入秘密

长度 = 64
值 = secrets.token_bytes(length)
打印( f"字节数:{值} " )

值 = secrets.token_hex(length)
打印( f"十六进制:{值} " )

使用秘密的好处是它提供了许多生成随机数据的方法,并且是出于安全目的而设计的。

与随机模块不同,应使用秘密来生成密码以确保其安全。

Zoneinfo 与 pytz

在 Python 3.9 之前,我们依靠 pytz 库进行时区处理。

现在,Python 包含 zoneinfo 模块,简化了时区操作。

从datetime导入datetime
从zoneinfo导入ZoneInfo 

nyc = ZoneInfo( "America/New_York" ) 
localized = datetime( 2022 , 6 , 4 , tzinfo=nyc)
打印( f "日期时间:{localized} , 时区:{localized.tzname()} , TZ 信息:{localized.tzinfo} " )

这对于处理时区来说是一个巨大的进步,但请记住,如果您的系统缺少时区数据,您仍然需要 tzdata 包。

数据类与命名元组

Python 3.7 引入了数据类,使得定义数据结构变得更加容易。

数据类可以替代命名元组,提供不可变对象、默认值和类型提示。

从数据类导入数据类

@dataclass
类 用户:
    姓名:str
    姓氏:str
    密码:字节

u = User(“John”,“Doe”,b'secret')
打印(u)

这不仅简化了代码,还提高了可读性。除非您创建了数百万个实例,否则性能差异很小。

毕竟程序员最大的敌人是拖延症,而不是执行效率。

正确记录与打印

有时我们会使用打印语句进行调试,但在生产环境中,使用日志记录模块是更好的选择。

导入日志记录
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( "发生了一个严重错误。" ) 
logging.warning( '这是一个警告。' )

日志记录有助于更好地记录信息,并允许设置日志级别、格式等,从而增强调试体验。

f 字符串与格式

我们多久使用一次 str.format() 来连接字符串?

自从 Python 3.6 引入 f 字符串以来,字符串连接变得非常简单。

name = "world" 
print ( f"你好,{name}!" )

但是,f 字符串并不总是最好的选择。对于动态模板,仍然需要 str.format()。

def  func ( tpl: str , param1: str , param2: str ) -> str :
    返回tpl.格式(param1=param1, param2=param2) 

some_template = "第一个模板:{param1}, {param2}"
 another_template = "其他模板:{param1} 和 {param2}" 
print (func(some_template, "Hello" , "World" )) 
print (func(another_template, "Hello" , "Python" ))

f 字符串非常适合静态字符串,因此请根据您的需要在它们之间进行选择。

Tomlib 与 tomli

最后,我们来谈谈如何处理 TOML 配置文件。Python 3.11 引入了 tomllib,无需安装 tomli 库。

导入tomllib

并使用 open ( "pyproject.toml" , "rb" )作为f: 
    config = tomllib.load(f)
    打印(config)

少一个依赖意味着少一些麻烦,特别是在多版本环境中。内置库总是能提供稳定感。

感谢关注雲闪世界。(Aws解决方案架构师vs开发人员&GCP解决方案架构师vs开发人员)

订阅频道(t.me/awsgoogvps_…) TG交流群(t.me/awsgoogvpsHost)