Во-первых, если вы хотите сделать численные сравнения с версией, используйте 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