我的一个项目使用自{em> python 3.3 以来可用的shlex.quote
。但shlex.quote
与pipes.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)
是否存在更好的做法?
答案 0 :(得分:11)
首先,如果您想对版本进行数值比较,请使用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
查看所有这些内容并将字符串转换为整数时,显然有点性能打击,等等,当你不需要时,但我怀疑#&# 39;重要的是。)
所以,我认为我写它的方式是:
try:
from shlex import quote as cmd_quote
except ImportError:
from pipes import quote as cmd_quote