Ipython: Finalizaciones de tabulación para rutas rotas nuevamente en 7.2.0

Creado en 14 dic. 2018  ·  32Comentarios  ·  Fuente: ipython/ipython

La finalización de tabulación para las rutas dentro de las cadenas parece estar rota nuevamente (anteriormente se señaló en muchos lugares, como # 10961, # 10996, número de cuaderno # 3333 ). Esto es lo que obtengo en v7.2.0 :

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

Comparado con el comportamiento en v7.1.1 :

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

Probablemente relacionado con # 11503, ya que deshabilitar Jedi (establecer c.IPCompleter.use_jedi = False en ipython_config.py ) da el comportamiento correcto.

Información del sistema

{'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

Comentario más útil

La degradación a ipython == 7.1.1 parecía funcionar como una solución para mí.

Todos 32 comentarios

Tengo el mismo problema, ipython 7.2.0.

La degradación a ipython == 7.1.1 parecía funcionar como una solución para mí.

¿Alguien podría compartir si habilitar jedi ayudó a su flujo de trabajo, y si lo hizo, me gustaría saber cómo?

Ciertamente hizo mi vida mucho más difícil: sin finalización de varios niveles, sin finalización de carpeta, ni puedo usar el autocompletado antes de ejecutar la celda ( df = pd.DataFrame(); df.val<TAB> falla)

El error ciertamente también me ha hecho la vida mucho más difícil.

La finalización automática es probablemente una de las características más importantes de un shell interactivo. ¿Hay alguna forma de que jedi y el autocompletado de ruta puedan coexistir?
Algunas heurísticas muy simples para decidir usar jedi o la finalización heredada ayudarán mucho: si uno está en una cadena, entonces es poco probable que desee nombres del espacio de nombres actual.

Para aquellos que han tenido problemas con la degradación, encontré que el comentario de @ivirshup es muy útil: deshabilitar jedi autocompletar en la configuración de ipython. Si aún no lo ha hecho, puede generar un ipython_config.py con:

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

Y cambia c.IPCompleter.use_jedi = False en ipython_config.py

[The jedi completer] ciertamente me hizo la vida mucho más difícil: sin completar en varios niveles, sin completar en carpetas, […]

No no no. No es el jedi completer el que hace eso. Hay varios finalizadores y está describiendo que se seleccionó el finalizador incorrecto porque el código de selección del finalizador está roto. Y tocar la lista de finalistas habilitando jedi descubrió ese error. @takluyver describe el problema en https://github.com/ipython/ipython/pull/10996#issuecomment -378288569.

Deshabilitar jedi nuevamente es una solución temporal, pero en realidad arreglar el código de selección completo (# 11064 creo) sería, por supuesto, una solución mucho mejor.

Tengo entendido que todos los completadores están trabajando al mismo tiempo. Los finalizadores se definen aquí y todos se utilizan al mismo tiempo . La lista matches (el resultado de la finalización automática) contendrá la concatenación de todos los resultados de los completadores, y el file_matches completer sigue siendo parte de ella.

Así que la finalización de la ruta / nombre de archivo no está "rota" cuando jedi está habilitado, es solo que hay tantos resultados (provenientes de jedi) que ya no puede ver la ruta de su archivo coincidente.

Mi primera idea para una solución sería deshabilitar la finalización automática de jedi al escribir una cadena. Funcionaría eso?
Lo único que no funcionaría es la finalización automática al ejecutar código con eval o exec , pero creo que no podemos solucionar todos los casos de uso. Y parece que a algunas personas les gusta el autocompletado de la ruta del archivo.

EDITAR: Al leer el otro problema que vinculó a @ flying-sheep # 11064, entiendo que ya existe una lógica para no usar jedi al escribir una cadena, pero ¿está rota?

Solo para ilustrar lo que estoy diciendo. Ambas capturas de pantalla se tomaron usando jedi, ves que la autocompletación de la ruta aún funciona, solo necesitas escribir un poco más porque hay más coincidencias.
test1
test2

Ese es generalmente mi problema: escribir un poco ayuda, pero no siempre es una opción si no conoce la primera letra del archivo. Incluso si claramente comenzaste a escribir una ruta, después de cada "/", el que completó "se restablece" al modo predeterminado de mostrarme abs (), todos () y otros elementos internos.
image

Es un gran problema si tiene rutas largas con algunas carpetas anidadas. El autocompletado de Bash solo agregaría cosas en la "pestaña". Con el autocompletado de ipython actual, debe recordar la primera letra o algunas de cada carpeta / archivo, escribirla y luego seguir algunas incorporaciones antes de encontrar su archivo / carpeta.

Si hubiera una forma de eliminar todos los elementos integrados del autocompletado y toda la magia de ipython, ¡ya sería mucho mejor!

Sé cómo escribir 'abs', y la mayoría de nosotros podemos escribirlo varias veces más rápido que seleccionarlo de la lista de autocompletado. ¡No estoy seguro de que haya una buena razón para ello, y otras incorporaciones largas de 3-4 letras, para estar allí en primer lugar! Idealmente, si hubiera una manera de editar la lista de incorporaciones, dejaría algunos nombres largos que uso, como DepercationWarning, y me desharía de todo lo demás.

Solo mire el caso de uso en la imagen: ¿Por qué querría escribir un nombre de objeto Python dentro de un literal de cadena?

Puedo encontrar un caso de uso simple:

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

Tal vez sea un caso de uso menos común, pero puede suceder. Estoy de acuerdo en que la finalización de la ruta es más importante que este caso de uso para la mayoría de los usuarios.

Sí, es una posibilidad, y algunas personas confían mucho en el ejecutivo.

Idealmente, la función de autocompletar debería detectar que está en modo de nombre de archivo y, a partir de ahí, funcionar como una finalización normal de la pestaña de bash. Un buen proxy comienza con "/", "./" o "C:" "D:" etc.

Es incluso menos probable que una cadena que comience con estas variables contenga expresiones de Python válidas.

Estoy seguro de que se puede hacer un ejemplo de a = "C:print(abs(-3))"; exec(a[2:]) pero eso es muy poco probable.

Sí, en realidad, se supone que el código omite la finalización de jedi cuando se escribe una cadena. Vea esta línea: https://github.com/ipython/ipython/blob/65778adec13a65f82c5d2bab123e7a63516702c8/IPython/core/completer.py#L1375
Y se basa en la lógica de análisis interno de jedi para tratar de averiguar si estamos en una cadena o no.
Probé un poco este código y resulta que está un poco roto, por ejemplo, al escribir path = " verá que está en una cadena, pero no con path = "./ . Supongo que podemos encontrar una mejor solución usando tokenize .

¿Es porque Jedi no cree que sea un ErrorLeaf, o es porque retroceder por dos nodos es insuficiente?

No estoy seguro, y rápidamente cambié de opinión a tokenize porque no me gustó el hecho de que se basa en cosas jedi internas (API privada).

tokenize también tiene su problema. ¿Qué pasa si la celda genera un IndentationError o SyntaxError antes de la apertura de la cadena?

Es posible que deba retroceder las líneas gradualmente, pero entonces siempre espera un error cerca del cursor debido a la declaración de cadena incompleta.

Con tokenize estoy pensando en una lógica simple como la que se hace en inputtransformer2.py . Existe cierta lógica para saber si el usuario está escribiendo una lista o un diccionario en la terminal, de modo que al presionar enter no ejecutes el código, pones una nueva línea:
test1
test2
Tal vez podamos probar algo equivalente con los caracteres " y ' (puedo intentar llegar a un PR).

También otra idea podría ser usar regexp, aunque sería inútil en este caso: P

tokenize también tiene su problema. ¿Qué pasa si la celda genera un IndentationError o SyntaxError antes de la apertura de la cadena?

Supongo que simplemente no se completaría ... ¿Cuál es el comportamiento actual? ¿El autocompletado aún funciona cuando tiene un SyntaxError en su código? Deberíamos comprobar

Mismo problema después de actualizar a 7.3.0.

Sí, funciona cuando tiene un SyntaxError.

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

IIRC tokenize es bastante robusto con respecto a los errores de sintaxis: el tipo de fragmento que muestra aún puede ser tokenizado correctamente, el error solo vendría cuando intente dar sentido a los tokens.

No estoy seguro de qué haría con algo como una cadena sin terminar en la línea anterior, lo que podría ser un error de sintaxis en el nivel de tokenización.

Problemas similares con la última instalación de conda:

python                    3.7.3
ipykernel                 5.1.0              
ipython                   7.4.0           

De hecho, no consigo completar

El problema persiste en IPython 7.7.0 instalado a través de 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

Y lo será hasta que se resuelva este problema y el número 10926. @ JeremySikes73 y yo dimos una explicación de lo que está mal, y estoy bastante seguro de que el problema es el mismo: todos los comparadores de IPython devuelven resultados, mientras que deberíamos a) ejecutar solo los relevantes ob) agregar código a los comparadores que hacen no devuelven nada cuando sus resultados serían irrelevantes.

Gracias por intentar ayudar, pero creo que es más productivo leer el número 10926, sumergirse en el código y descubrir cómo mejorar la situación que decir "sigue siendo un problema".

@meeseeksdev se busca ayuda con la etiqueta

@meeseeksdev etiqueta de finalización de tabulación

Para aquellos que han tenido problemas con la degradación, encontré que el comentario de @ivirshup es muy útil: deshabilitar jedi autocompletar en la configuración de ipython. Si aún no lo ha hecho, puede generar un ipython_config.py con:

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

Y cambia c.IPCompleter.use_jedi = False en ipython_config.py

¿Qué archivo editar? ipython_kernel_config.py o ipython_config.py ?

Una solución temporal para este problema es agregar una segunda barra después de presionar el tabulador.

Después de escribir '/<TAB>
image

Después de escribir /
image

Una vez que se selecciona un elemento, solo habrá una barra como separador:

Después de presionar regresar
image

Tenga en cuenta que agregar la segunda barra antes de presionar el tabulador no cambia el menú emergente.

Actualicé a la última versión de ipython a partir de hoy (7.11.0) y el problema persiste.

@ flying-sheep @augustogoulart ¿Estás abierto a

Esto no soluciona completamente el # 10926 o esto, ya que sería bueno apagarlo (en mi opinión):

  • la finalización del archivo coincide cuando está en una cadena de clave de diccionario
  • coincide con la finalización mágica cuando en cualquier cadena

pero al menos apaga jedi cuando está en una cadena, lo que hace que mis propios patrones de uso sean viables.

Yo solo soy un colaborador de poca monta, pero apuesto a que les gustaría ayuda para solucionar este problema

¿Fue útil esta página
0 / 5 - 0 calificaciones