atom - python jedi: ¿cómo recuperar métodos de instancias?
python jedi vim (1)
Esto parece un error, donde jedi.evaluate.representation.Instance.__getattr__()
bloquea erróneamente la evaluación de .names_dict
. Agregué una solicitud de extracción al repositorio jedi para arreglar esto. Mientras tanto, puede agregar ''names_dict'' a la lista blanca en Instance.__getattr__()
en su copia de jedi/evaluate/representation.py
, o usar el siguiente código para parchear este método automáticamente para la sesión actual.
import jedi
def patch_jedi():
__old__getattr__ = jedi.evaluate.representation.Instance.__getattr__
def __patched__getattr__(self, name):
if name == ''names_dict'':
# do a simplified version of __old__getattr__, bypassing the name check
return getattr(self.base, name)
else:
# use standard behavior
return __old__getattr__(self, name)
# test whether jedi has been updated to avoid the Instance.defined_names() bug
try:
jedi.names("lst = list()")[0].defined_names()
except AttributeError as e:
if e.args[0].startswith("Instance ") and e.args[0].endswith("Don''t touch this (names_dict)!"):
# patch jedi to avoid this error
print "patching jedi"
jedi.evaluate.representation.Instance.__getattr__ = __patched__getattr__
else:
# something else strange is going on
raise
patch_jedi()
print jedi.names("lst = list()")[0].defined_names()
# or: print jedi.Script("lst = list()").goto_definitions()[0].defined_names()
Debo señalar que no estoy familiarizado con jedi
, por lo que no sé si se defined_names()
que defined_names()
funciona para las definiciones que crean instancias. El código anterior no arreglará referencias como jedi.names("lst = []")[0].defined_names()
, y no hay un parche obvio para hacerlo. Entonces puede haber algo más profundo que yo desconozca. Esperemos que el desarrollador ayude a aclarar esto en respuesta a esa solicitud de extracción.
Construí un editor de texto simple con alguna función de accesibilidad para el software de lectura de pantalla. Estoy usando Python para .NET (pythonnet) para mostrar un formulario que contiene un cuadro de texto enriquecido. Cuando el usuario presiona la pestaña después de un período, emerge un menú contextual con terminaciones para el elemento seleccionado. Ok, funciona bien con los objetos de Python, pero no funciona con los objetos en vivo .NET, no hay solución para este problema. Ahora, quiero construir un objeto TreeView con todos los nombres y definiciones del módulo que estoy editando.
Entonces, por ejemplo, escribo:
import sys
import os
lst = list()
etc ... Si uso jedi.names de mi fuente, puedo recuperar os, sys y lst. Para cada nombre, quiero recuperar definiciones secundarias, como funciones para el módulo sys y os, y métodos para lst. No puedo encontrar una manera de hacer esto con jedi:
names = jedi.names(MySource)
names[0].defined_names() # works for sys
names[1].defined_names() # works for os
names[2].defined_names() # doesn''t work for lst instance of list().
¿Alguna sugerencia? Traté de usar más y más editores, pero el soporte de accesibilidad es muy, muy malo ...