Ipython: Завершение вкладок для путей, снова нарушенных в 7.2.0

Созданный на 14 дек. 2018  ·  32Комментарии  ·  Источник: ipython/ipython

Завершение табуляции для путей внутри строк, похоже, снова не работает (ранее отмечалось во многих местах, например, # 10961, # 10996, проблема с записной книжкой # 3333 ). Вот что я получаю в v7.2.0 :

screen shot 2018-12-14 at 12 39 17 pm

По сравнению с поведением в v7.1.1 :

screen shot 2018-12-14 at 12 38 20 pm

Вероятно, связано с # 11503, так как отключение джедаев (установка c.IPCompleter.use_jedi = False в ipython_config.py ) дает правильное поведение.

Системная информация

{'commit_hash': '523ed2fe5',
 'commit_source': 'installation',
 'default_encoding': 'UTF-8',
 'ipython_path': '/usr/local/lib/python3.6/site-packages/IPython',
 'ipython_version': '7.2.0',
 'os_name': 'posix',
 'platform': 'Darwin-17.7.0-x86_64-i386-64bit',
 'sys_executable': '/usr/local/opt/python/bin/python3.6',
 'sys_platform': 'darwin',
 'sys_version': '3.6.5 (default, Jun 17 2018, 12:13:06) \n'
                '[GCC 4.2.1 Compatible Apple LLVM 9.1.0 (clang-902.0.39.2)]'}

help wanted tab-completion

Самый полезный комментарий

Переход на ipython == 7.1.1, похоже, помог мне.

Все 32 Комментарий

У меня такая же проблема, ipython 7.2.0.

Переход на ipython == 7.1.1, похоже, помог мне.

Может ли кто-нибудь поделиться, если включение jedi помогло их рабочему процессу, и если да, я хотел бы знать, как?

Это определенно сделало мою жизнь намного сложнее: нет многоуровневого завершения, нет завершения папки, и я не могу использовать автозаполнение перед запуском ячейки ( df = pd.DataFrame(); df.val<TAB> терпит неудачу)

Ошибка, безусловно, значительно усложнила мою жизнь.

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

Для тех, кто столкнулся с проблемами при переходе на более раннюю версию , я нашел комментарий jedi в конфигурации ipython. Если вы еще этого не сделали, вы можете создать ipython_config.py с помощью:

# Generate config
ipython profile create
# Edit config file in vim
vim .ipython/profile_default/ipython_kernel_config.py 

И измените c.IPCompleter.use_jedi = False на ipython_config.py

[Завершение джедаев], безусловно, значительно усложнило мне жизнь: нет многоуровневого завершения, нет завершения папки, […]

Нет нет нет. Это делает не джедай-завершитель. Есть несколько завершителей, и вы описываете, что выбран неправильный завершитель, потому что код выбора завершителя не работает. И прикоснувшись к списку завершителей, включив джедаи, вы обнаружили эту ошибку. @takluyver описывает проблему в https://github.com/ipython/ipython/pull/10996#issuecomment -378288569.

Отключение джедаев снова - временный обходной путь, но на самом деле исправление кода выбора завершения (я думаю, # 11064), конечно, было бы гораздо лучшим решением.

Насколько я понимаю, все комплектующие работают одновременно. Завершившие определены здесь , и все они используются одновременно . Список matches (результат автозаполнения) будет содержать конкатенацию всех результатов завершителей, а завершитель file_matches по-прежнему является его частью.

Таким образом, завершение пути / имени файла не «нарушается», когда включен jedi, просто существует так много результатов (исходящих от jedi), что вы больше не можете видеть совпадение пути к файлу.

Моя первая идея для исправления состояла бы в том, чтобы отключить автозаполнение джедаев при вводе строки? Это сработает?
Единственное, что не сработает, - это автозаполнение при выполнении кода с eval или exec , но я думаю, что мы не сможем исправить каждый случай использования. И похоже, некоторым нравится автозаполнение пути к файлу.

РЕДАКТИРОВАТЬ: читая другую проблему, которую вы связали с @ flying-Sheep # 11064, я понимаю, что уже существует логика, по которой джедай не используется при вводе строки, но она не работает?

Просто чтобы проиллюстрировать то, что я говорю. Оба скриншота были сделаны с использованием jedi, вы видите, что автозаполнение пути все еще работает, вам просто нужно ввести немного больше, потому что совпадений больше.
test1
test2

В общем, это моя проблема: немного помогает печатать, но это не всегда вариант, если вы не знаете первую букву файла. Даже если вы явно начали вводить путь, после каждого "/" завершитель "сбрасывается" в режим по умолчанию, показывая мне abs (), all () и другие встроенные функции.
image

Это большая проблема, если у вас длинные пути с несколькими вложенными папками. Автозаполнение Bash просто добавит элементы на «вкладку». С текущим автозаполнением ipython вам нужно запомнить первую букву или несколько каждой папки / файла, ввести ее, а затем еще пройти несколько встроенных команд, прежде чем вы найдете свой файл / папку.

Если бы был способ удалить все встроенные команды из автозаполнения и всю магию ipython - было бы уже намного лучше!

Я знаю, как набирать «абс», и большинство из нас может ввести его в несколько раз быстрее, чем выбрать его из списка автозаполнения. Я не уверен, что есть веская причина для этого и других встроенных функций длиной в 3-4 буквы, чтобы быть там в первую очередь! В идеале, если бы существовал способ редактировать список встроенных команд, я бы просто оставил несколько длинных имен, которые использую, например DepercationWarning, и избавился бы от всего остального.

Просто посмотрите на пример использования на изображении: зачем мне вводить имя объекта Python внутри строкового литерала?

Я могу найти простой вариант использования:

exec("print(abs(-3))", [globals()])

Возможно, это менее распространенный вариант использования, но это может случиться. Я согласен, что завершение пути для большинства пользователей важнее, чем этот вариант использования.

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

В идеале автозаполнение должно определять, что оно находится в режиме имени файла, и оттуда работать как обычное завершение табуляции bash. Хороший прокси начинается с «/», «./» или «C:», «D:» и т. Д.

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

Я уверен, что можно привести пример a = "C:print(abs(-3))"; exec(a[2:]) но это маловероятно.

Да, на самом деле код должен пропускать джедайское завершение, когда вы набираете строку. Посмотрите эту строку: https://github.com/ipython/ipython/blob/65778adec13a65f82c5d2bab123e7a63516702c8/IPython/core/completer.py#L1375
И он полагается на внутреннюю логику парсинга джедаев, пытаясь понять, находимся мы в строке или нет.
Я немного протестировал этот код, и оказалось, что он немного сломан, например, при вводе path = " он увидит, что вы находитесь в строке, но не с path = "./ . Думаю, мы можем придумать лучшее решение, используя tokenize .

Это потому, что джедаи не думают, что это ErrorLeaf, или потому, что возврата на два узла недостаточно?

Я не уверен, и я быстро переключился на tokenize потому что мне не нравился тот факт, что он полагается на внутренний джедайский материал (частный API).

У tokenize тоже есть проблема. Что, если ячейка вызывает ошибку IndentationError или SyntaxError перед открытием строки?

Возможно, вам придется возвращать строки постепенно, но тогда вы всегда ожидаете ошибки рядом с курсором из-за неполного объявления строки?

С tokenize я думаю о простой логике, как это сделано в inputtransformer2.py . Существует некоторая логика, позволяющая узнать, набирает ли пользователь список или словарь в терминале, поэтому при нажатии enter вы не выполняете код, вы помещаете новую строку:
test1
test2
Может быть, мы можем попробовать что-то эквивалентное с символами " и ' (я могу попытаться придумать PR).

Еще одна идея - использовать регулярное выражение, но в этом случае я был бы бесполезен: P

У tokenize тоже есть проблема. Что делать, если ячейка вызывает ошибку IndentationError или SyntaxError перед открытием строки

Думаю, это просто не завершится ... Каково текущее поведение? Автодополнение по-прежнему работает, когда в вашем коде есть SyntaxError? Мы должны проверить

Та же проблема после обновления до 7.3.0.

Да, это работает, когда у вас есть SyntaxError.

Screenshot from 2019-03-28 10-48-20

IIRC tokenize довольно надежен в отношении синтаксических ошибок - тип фрагмента, который вы показываете, все еще можно токенизировать нормально, ошибка возникнет только тогда, когда вы попытаетесь разобраться в токенах.

Я не уверен, что он будет делать с чем-то вроде незавершенной строки в предыдущей строке, что может быть синтаксической ошибкой на уровне токенизации.

Похожие проблемы с последней установкой conda:

python                    3.7.3
ipykernel                 5.1.0              
ipython                   7.4.0           

Я на самом деле не получаю автодополнения на всех. Только внутри функции (Shift + двойная вкладка) я получаю завершение строки документации. Нет никакого завершения метода для объектов. Ввод путей в строках работает должным образом, т.е. глобальные переменные не указаны.

Проблема остается в IPython 7.7.0, установленном через conda:

ipython                   7.7.0            py37h5ca1d4c_0    conda-forge
ipython_genutils          0.2.0                      py_1    conda-forge
jedi                      0.14.1                   py37_0    conda-forge
python                    3.7.3                h33d41f4_1    conda-forge

И так будет до тех пор, пока этот выпуск и номер 10926 не будут закрыты. @ JeremySikes73 и я объяснили, что не так, и я почти уверен, что проблема та же: все сопоставители IPython возвращают результаты, в то время как мы должны либо а) запускать только соответствующие, либо б) добавлять код в сопоставители, который делает они ничего не возвращают, если их результаты не имеют значения.

Спасибо за попытку помочь, но я думаю, что более продуктивно прочитать # 10926, погрузиться в код и выяснить, как исправить ситуацию, чем говорить «это все еще проблема».

Требуется помощь по тегу

Завершение табуляции тега

Для тех, кто столкнулся с проблемами при переходе на более раннюю версию , я нашел комментарий jedi в конфигурации ipython. Если вы еще этого не сделали, вы можете создать ipython_config.py с помощью:

# Generate config
ipython profile create
# Edit config file in vim
vim .ipython/profile_default/ipython_kernel_config.py 

И измените c.IPCompleter.use_jedi = False на ipython_config.py

Какой файл редактировать? ipython_kernel_config.py или ipython_config.py ?

Временное решение этой проблемы - добавить вторую косую черту после нажатия табуляции.

После ввода '/<TAB>
image

После ввода /
image

После выбора элемента в качестве разделителя будет использоваться только одна косая черта:

После нажатия возврата
image

Обратите внимание, что добавление второй косой черты перед нажатием вкладки не изменяет всплывающее меню.

Я обновился до последней версии ipython на сегодняшний день (7.11.0), и проблема все еще сохраняется.

@ flying-Sheep @augustogoulart Вы готовы принять участие в этом? (Я имею в виду, тег «helpwanted» предполагает это, но я не являюсь участником, поэтому не уверен в нормах разработчиков здесь.) У меня есть некоторые незначительные изменения в логике определения того, находимся мы в строке или нет. , который, хотя и не является идеальным решением, по крайней мере, лучше справляется с отключением джедаев.

Это не полностью исправляет # 10926 или это, так как было бы неплохо отключить (на мой взгляд):

  • завершение файла совпадает с ключевой строкой словаря
  • магическое завершение совпадает с любой строкой

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

Я сам мелкий участник, но держу пари, они хотели бы помочь исправить это!

Была ли эта страница полезной?
0 / 5 - 0 рейтинги