#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
, возможно, «более правильным» из двух.