Почему Sublime Text 3 разрешает комментарии в файлах конфигурации JSON?

Использование комментариев в файлах конфигурации JSON в Sublime Text может привести к невозможности декодирования объектов JSON. Вот моя история.

Я недавно установил плагин SublimeREPL в свой Sublime Text 3. Вскоре я обнаружил, что по умолчанию он использует Python 2.7 вместо 3.5, поэтому я добавил свои собственные файлы конфигурации Python 3.5 в соответствии с SublimeREPL Docs, чтобы он поддерживал Python3.5.

Мой файл конфигурации Packages/SublimeREPL/config/Python3.5/Main.sublime-menu JSON выглядит так:

[
 {
    "id": "tools",
    "children":
    [{
        "caption": "SublimeREPL",
        "mnemonic": "R",
        "id": "SublimeREPL",
        "children":
        [
            {"caption": "Python3.5",
            "id": "Python3.5",

             "children":[
                {"command": "repl_open",
                 "caption": "Python3.5",
                 "id": "repl_python3.5",
                 "mnemonic": "P",
                 "args": {
                    "type": "subprocess",
                    "encoding": "utf8",
                    "cmd": ["python3", "-i", "-u"],
                    "cwd": "$file_path",
                    "syntax": "Packages/Python/Python.tmLanguage",
                    "external_id": "python3",
                    "extend_env": {"PYTHONIOENCODING": "utf-8"}
                    }
                },
                // run files
                {"command": "repl_open",
                 "caption": "Python3.5 - RUN current file",
                 "id": "repl_python3.5_run",
                 "mnemonic": "R",
                 "args": {
                    "type": "subprocess",
                    "encoding": "utf8",
                    "cmd": ["python3", "-u", "$file_basename"],
                    "cwd": "$file_path",
                    "syntax": "Packages/Python/Python.tmLanguage",
                    "external_id": "python3",
                    "extend_env": {"PYTHONIOENCODING": "utf-8"}
                    }
                }
            ]}
        ]
    }]
}]

Обратите внимание, что в этом файле есть комментарий // запускать файлы. Эта конфигурация отлично работает из инструментов строки меню-> SublimeREPL-> Python3.5. Однако, когда я попытался связать клавишу F5 с repl_python3.5_run, чтобы иметь более легкий доступ к 3.5, в консоли возникло следующее исключение:

Traceback (most recent call last):

  File "./python3.3/json/decoder.py", line 367, in raw_decode
StopIteration

During handling of the above exception, another exception occurred:

Traceback (most recent call last):

File "/opt/sublime_text/sublime_plugin.py", line 551, in run_
    return self.run(**args)

File "/home/ubuntu/.config/sublime-text-3/Packages/SublimeREPL/run_existing_command.py", line 32, in run
    json_cmd = self._find_cmd(id, path)

File "/home/ubuntu/.config/sublime-text-3/Packages/SublimeREPL/run_existing_command.py", line 41, in _find_cmd
    return self._find_cmd_in_file(id, file)

 File "/home/ubuntu/.config/sublime-text-3/Packages/SublimeREPL/run_existing_command.py", line 53, in _find_cmd_in_file
    data = json.loads(bytes)

 File "./python3.3/json/__init__.py", line 316, in loads

 File "./python3.3/json/decoder.py", line 351, in decode

 File "./python3.3/json/decoder.py", line 369, in raw_decode

ValueError: No JSON object could be decoded

После того, как я удалил комментарий // run files. Клавиша F5 работает нормально. Именно комментарий вызывает проблему. Sublime Text использует JSON в качестве файлов конфигурации, многие файлы конфигурации поставляются с // комментариями к стилю. Как мы знаем, комментарии изначально удаляются из JSON.

Тогда как возвышенный текст может разрешать комментарии в файлах конфигурации, использует ли он канал? Если это так, как может произойти сбой привязки моего ключа?


person Naomi    schedule 24.07.2016    source источник
comment
ПОЖАЛУЙСТА, НЕ РАЗМЕЩАЙТЕ ТЕКСТ КАК ИЗОБРАЖЕНИЯ. Скопируйте и вставьте текст в свой вопрос. Изображения недоступны для поиска и не могут быть интерпретированы программами чтения с экрана для людей с нарушениями зрения. Используйте ссылку изменить, чтобы изменить свой вопрос. См. это для получения дополнительной информации.   -  person MattDMo    schedule 24.07.2016
comment
Вы правы. Я уже исправил свою ошибку. Спасибо, что указали на это. @MattDMo   -  person Naomi    schedule 25.07.2016


Ответы (1)


Сама Sublime (основная программа, а не плагины, такие как SublimeREPL) использует внутреннюю библиотеку JSON для разбора файлов конфигурации, таких как .sublime-settings, .sublime-menu, .sublime-build и т. д. Этот (скорее всего, настроенный) парсер допускает комментарии.

Однако плагины запускаются через версию Python (в настоящее время 3.3.6 для сборок для разработчиков), связанную с исполняемым файлом Sublime plugin_host. Любой подключаемый модуль, который импортирует модуль json стандартной библиотеки (например, run_existing_command.py, должен подчиняться ограничениям этого модуля, включая неспособность распознавать комментарии в стиле JavaScript, такие как // в JSON.

Одним из способов обхода этого может быть импорт внешнего модуля, такого как commentjson, который удаляет различные типы комментариев, в том числе // перед передачей данных в стандартный модуль json. Поскольку это чистый модуль Python, вы можете просто скопировать каталог source в основной каталог SublimeREPL, а затем отредактировать run_existing_command.py соответственно - измените строку 6 на import commentjson as json и все готово.

person MattDMo    schedule 24.07.2016
comment
В ST3 вы можете получить доступ к внутренней библиотеке и декодировать строку json с помощью функции sublime.decode_value(string). - person r-stein; 24.07.2016
comment
@r-stein интересно, я никогда раньше не смотрел на эту функцию. К сожалению, SublimeREPL, по-видимому, был заброшен некоторое время назад, и хотя он все еще работает хорошо, шансы на появление каких-либо новых функций или исправлений ошибок очень малы или равны нулю. - person MattDMo; 24.07.2016
comment
Спасибо. Это звучит как интересное решение. Я попробую. @MattDMo - person Naomi; 25.07.2016