gpt4 book ai didi

Python 3 向后兼容性(shlex.quote 与 pipes.quote)

转载 作者:太空狗 更新时间:2023-10-30 00:31:58 29 4
gpt4 key购买 nike

我的一个项目使用 shlex.quote,它从 python 3.3 开始可用。但是 shlex.quotepipes.quote 相同,后者在移动到 shlex 后已弃用。

现在为了兼容性我正在使用这个代码:

def cmd_quote(string):
import sys
if int(sys.version[2]) < 3:
import pipes
return pipes.quote(string)
else:
import shlex
return shlex.quote(string)

是否存在更好的做法?

最佳答案

首先,如果您想对版本进行数值比较,请使用 version_info , 不要尝试解析 version.*

中的字符串

这也意味着您可以利用比较元组的方式并编写如下代码:

if sys.version_info < (3, 3):

…即使 Python 达到 3.10.0 或 4.0 也不会中断。

* 除非您需要担心 1.5 与 2.0,在这种情况下,您显然在 Usenet 和 StackOverflow 之间有一个时间机器网关,并且您肯定可以想到更好的用途。


无论如何,最好只测试一开始就存在的 shlex.quote。这样,读者就可以清楚地知道您在做什么:如果可能,使用 shlex.quote,如果不行,则回退到 pipes.quote

你会在所有地方看到这种模式——即使在标准库中,如果可能的话,代码是从 C 加速器模块导入的,但如果不是,则使用回退代码(例如,如果你使用 PyPy 而不是 CPython) .


另请注意,pipes.quote 记录在 2.7 中。不是 3.0-3.2(这似乎是您关心的……),也不是 2.6 或任何其他版本。您依赖于特定实现中恰好存在的东西。 (好吧,实际上,在所有这些中,*但是,如果你不必依赖它,为什么还要依赖它呢?)

* 据我所知,没有任何 3.2 实现具有 pipesshlex 但没有 pipes.quote 。 future 可能不会创建太多新的 3.2 实现。


此外,虽然在函数中间使用 import 偶尔会有用,但这样做有点奇怪。如果在您部署它的机器上安装有问题,您真的希望能够成功导入您的模块,但随后在调用某些函数时得到 ImportError 吗?人们对这种事情感到困惑,并一直跑到 SO 那里寻求帮助。 :)(在不需要时查看 sys.modules 并将字符串转换为 int 等,这显然也会对性能造成一些影响,但我怀疑这是否会重要。)


所以,我认为我会这样写:

try:
from shlex import quote as cmd_quote
except ImportError:
from pipes import quote as cmd_quote

关于Python 3 向后兼容性(shlex.quote 与 pipes.quote),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26790916/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com