В чем разница между distutils.util.split_quoted и shlex.split

#python #distutils #shlex

#python #distutils #shlex

Вопрос:

Стандартная библиотека python предоставляет distutils.util.split_quoted и shlex.split .

Есть ли какая-либо ситуация, в которой distutils.util.split_quoted(s) дает другой результат shlex.split(s) ?

Ответ №1:

ДА. Эти алгоритмы расходятся во мнениях относительно определения пробела: shlex жестко кодирует четыре символа ' trn' , однако distutils использует string.whitespace в регулярном выражении. Следовательно, он дополнительно рассматривает некоторые другие символы в качестве разделителей.

formfeed:

 >>> distutils.util.split_quoted('AfB')
['A', 'B']
>>> shlex.split('AfB')
['Ax0cB']
  

вертикальная вкладка:

 >>> distutils.util.split_quoted('AvB')
['A', 'B']
>>> shlex.split('AvB')
['Ax0bB']
  

Комментарии:

1. Является ли одно «более правильным», чем другое? Например, указывает ли posix набор символов-пробелов, которые будут использоваться в качестве разделителей?

2. Это сложно. Posix предписывает учитывать переменную IFS (например, вы можете настроить IFS на использование запятых и пробелов, а затем python3 myscript.py a,b получите ["myscript.py", "a", "b"] в sys.argv . Если IFS не задан, то система использует только пробелы и табуляции — она не должна разделять поля ни при подаче формы, ни при вертикальной табуляции, ни даже при возврате каретки (и я проверил это в моей системе, совместимой с posix, действительно, r не разделяет слова). Итак, я бы сказал, что ни то, ни другое не является строго правильным, но shlex.split , возможно, «более правильным» из двух.