2014-11-06 4 views
2

В одном из моих проектов используется shlex.quote, который доступен с python 3.3. Но это shlex.quote такое же, как pipes.quote, которое устарело после переезда в shlex.Python 3 обратная совместимость (shlex.quote vs 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) 

ли какие-либо лучше практика существует?

ответ

8

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