添加图片注释,不超过 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)