Невозможно экранировать экранирующие кавычки при присвоении строки переменной

У меня есть команда bash для запуска, для которой я назначаю ее переменной. Команда, которую нужно запустить:

papermill athena-py/params_to_dict.ipynb athena-py/output_params_to_dict.ipynb -y '{"aviral":"srivastava"}'

Я могу распечатать его в python3, как:

>>> print("papermill athena-py/params_to_dict.ipynb athena-py/output_params_to_dict.ipynb -y '{}'".format('{"aviral":"srivastava"}'))
papermill athena-py/params_to_dict.ipynb athena-py/output_params_to_dict.ipynb -y '{"aviral":"srivastava"}'

Однако, когда я присваиваю то же значение переменной:

a= "papermill athena-py/params_to_dict.ipynb athena-py/output_params_to_dict.ipynb -y '{}'".format('{"aviral":"srivastava"}')

Я получаю следующее:

'papermill athena-py/params_to_dict.ipynb athena-py/output_params_to_dict.ipynb -y \'{"aviral":"srivastava"}\''

Обратите внимание на \ в выводе.

Я ожидаю, что достигну желаемого результата (что делается в операторе print), используя назначение переменных.

не мог воспроизвести. Я получил papermill athena-py/params_to_dict.ipynb athena-py/output_params_to_dict.ipynb -y '{"aviral":"srivastava"}' распечатав a

LinPy 29.05.2019 07:24

Эти побеги будут видны только в REPL. Вы можете смело игнорировать их.

Selcuk 29.05.2019 07:27
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
66
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Обе струны абсолютно одинаковы. Вы можете наблюдать это, если вы запустите обе команды в IDE или через терминал, используя python script.py

print("papermill athena-py/params_to_dict.ipynb athena-py/output_params_to_dict.ipynb -y '{}'".format('{"aviral":"srivastava"}'))
a= "papermill athena-py/params_to_dict.ipynb athena-py/output_params_to_dict.ipynb -y '{}'".format('{"aviral":"srivastava"}')
print(a)

Результат будет

papermill athena-py/params_to_dict.ipynb athena-py/output_params_to_dict.ipynb -y '{"aviral":"srivastava"}'
papermill athena-py/params_to_dict.ipynb athena-py/output_params_to_dict.ipynb -y '{"aviral":"srivastava"}'

Просто Python добавил дополнительную обратную косую черту вокруг одинарных кавычек, потому что у нас также есть двойные кавычки в строке, а обратная косая черта экранирует одинарные кавычки, чтобы обеспечить печатное представление строки.

>>> print("papermill athena-py/params_to_dict.ipynb athena-py/output_params_to_dict.ipynb -y '{}'".format('{"aviral":"srivastava"}'))
papermill athena-py/params_to_dict.ipynb athena-py/output_params_to_dict.ipynb -y '{"aviral":"srivastava"}'
>>> a= "papermill athena-py/params_to_dict.ipynb athena-py/output_params_to_dict.ipynb -y '{}'".format('{"aviral":"srivastava"}')
>>> print(a)
papermill athena-py/params_to_dict.ipynb athena-py/output_params_to_dict.ipynb -y '{"aviral":"srivastava"}'
>>> a
'papermill athena-py/params_to_dict.ipynb athena-py/output_params_to_dict.ipynb -y \'{"aviral":"srivastava"}\''

По сути, экранированная строка является repr представлением строки.

Из документов: https://docs.python.org/3/library/functions.html#repr

repr(object)
Return a string containing a printable representation of an object

Ответ принят как подходящий

Посмотри на это,

>>> print("papermill athena-py/params_to_dict.ipynb athena-py/output_params_to_dict.ipynb -y '{}'".format('{"aviral":"srivastava"}'))
papermill athena-py/params_to_dict.ipynb athena-py/output_params_to_dict.ipynb -y '{"aviral":"srivastava"}'
>>> a= "papermill athena-py/params_to_dict.ipynb athena-py/output_params_to_dict.ipynb -y '{}'".format('{"aviral":"srivastava"}')

Здесь вы видите \, потому что он печатает строковый литерал в одинарных кавычках.

>>> a 
'papermill athena-py/params_to_dict.ipynb athena-py/output_params_to_dict.ipynb -y \'{"aviral":"srivastava"}\''

Если вы напечатаете переменную, она будет выглядеть нормально, как вам нужно.

>>> print(a) 
papermill athena-py/params_to_dict.ipynb athena-py/output_params_to_dict.ipynb -y '{"aviral":"srivastava"}'

Итак, я могу использовать переменную, игнорируя escape-последовательности?

Aviral Srivastava 29.05.2019 07:37

@AviralSrivastava Не забудьте принять ответ, если он рассеял ваши сомнения. Удачного кодирования!

shaik moeed 29.05.2019 07:59

bhaijaan, Есть ли что-то, что я должен импровизировать в вопросе? Он получил два отрицательных голоса.

Aviral Srivastava 29.05.2019 09:31

Другие вопросы по теме