我的一个项目使用的shlex.quote
自python 3.3起可用。但是该shlex.quote
与移至shlex之后已弃用的pipes.quote
相同。
现在为了兼容性,我使用以下代码:
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
。您到处都会看到这种模式,即使在stdlib中,如果可能的话,代码也会从C加速器模块导入,但如果没有,则使用后备代码(例如,如果您使用的是PyPy而不是CPython)。
另外,请注意
pipes.quote
仅在2.7中记录。不是3.0-3.2(这似乎是您所关心的…),2.6或任何其他版本。您所依赖的是某个特定实现中可能发生的事情。 (实际上,所有这些都*,但仍然,如果不需要的话,为什么要依靠它呢?)*据我所知,尚无3.2实现具有
pipes
和shlex
但没有pipes.quote
。将来可能不会创建太多新的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 - Python 3向后兼容性(shlex.quote与pipes.quote),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26790916/