Как правильно установить __doc__ для автозаполнения библиотек C ++ - PullRequest
0 голосов
/ 24 июня 2019

У нас есть модуль pybind11, и мы хотим дополнить код Jedi для его классов и функций. Наш подход состоял в том, чтобы установить строку документации __doc__ функций, чтобы джедай мог использовать их для завершения. Когда мы вызываем completions(), мы получаем пустой список. Джедай не печатает ошибок, также не через функцию set_debug_.

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

Что нам нужно сделать, чтобы джедаи автоматически выполняли пользовательские классы и функции библиотеки C ++? Работает ли это обычно с использованием __doc__, и если да, то как должен выглядеть формат?

ОБНОВЛЕНИЕ: Благодаря комментарию Дейва мы смогли дополнительно проанализировать проблему. Вот следующий пример:

import bitbuffer
bb = bitbuffer.BitBuffer(100)
bitbuffer. # completion works for the module
bitBuffer.BitBuffer. # completion works for the class
bb. # completion does not work for the instance of the class

Здесь следует вывод set_debug_function() джедая 0.14.0 для завершения bb.:

speed: init 17.217941999435425
speed: parsed 17.218032836914062
dbg: Start: completions

  dbg: eval_node <Name: bb@5,0>@(5, 0) in <ModuleContext: @1-5 is_stub=False>
  dbg: finder.filter_name 'bb' in (<ModuleContext: @1-5 is_stub=False>): [<TreeNameDefinition: string_name=bb start_pos=(3, 0)>]@(5, 0)
   dbg: eval_expr_stmt <ExprStmt: bb = bitbuffer.BitBuffer(100)@3,0> (<Name: bb@3,0>)
    dbg: eval_node PythonNode(atom_expr, [<Name: bitbuffer@3,5>, PythonNode(trailer, [<Operator: .>, <Name: BitBuffer@3,15>]), PythonNode(trailer, [<Operator: (>, <Number: 100>, <Operator: )>])])@(3, 5) in <ModuleContext: @1-5 is_stub=False>
     dbg: eval_node <Name: bitbuffer@3,5>@(3, 5) in <ModuleContext: @1-5 is_stub=False>
     dbg: finder.filter_name 'bitbuffer' in (<ModuleContext: @1-5 is_stub=False>): [<TreeNameDefinition: string_name=bitbuffer start_pos=(1, 7)>]@(3, 0)
     speed: import (<Name: bitbuffer@1,7>,) <ModuleContext: @1-5 is_stub=False> 0.0019109249114990234

     dbg: global search_module 'bitbuffer': <CompiledObject: <module 'bitbuffer' from '/home/software/build-Debug/install/myApp/python/lib/python3.6/site-packages/bitbuffer.so'>>
     dbg: after import: S{<CompiledObject: <module 'bitbuffer' from '/home/software/build-Debug/install/myApp/python/lib/python3.6/site-packages/bitbuffer.so'>>}
     dbg: finder._names_to_types: [<TreeNameDefinition: string_name=bitbuffer start_pos=(1, 7)>] -> S{<CompiledObject: <module 'bitbuffer' from '/home/software/build-Debug/install/myApp/python/lib/python3.6/site-packages/bitbuffer.so'>>}
    dbg: eval_trailer: PythonNode(trailer, [<Operator: .>, <Name: BitBuffer@3,15>]) in S{<CompiledObject: <module 'bitbuffer' from '/home/software/build-Debug/install/myApp/python/lib/python3.6/site-packages/bitbuffer.so'>>}
    dbg: finder.filter_name 'BitBuffer' in (<CompiledObject: <module 'bitbuffer' from '/home/software/build-Debug/install/myApp/python/lib/python3.6/site-packages/bitbuffer.so'>>): [<CompiledName: (<CompiledContextName: string_name=bitbuffer>).BitBuffer>]@None
    dbg: finder._names_to_types: [<CompiledName: (<CompiledContextName: string_name=bitbuffer>).BitBuffer>] -> S{<CompiledObject: <pybind11_builtins.pybind11_type object at 0x55be2f8f7278>>}
    dbg: eval_trailer: PythonNode(trailer, [<Operator: (>, <Number: 100>, <Operator: )>]) in S{<CompiledObject: <pybind11_builtins.pybind11_type object at 0x55be2f8f7278>>}
    dbg: global search_module 'builtins': <CompiledObject: <module 'builtins' (built-in)>>

    dbg: execute: <CompiledObject: <pybind11_builtins.pybind11_type object at 0x55be2f8f7278>> <TreeArguments: <Number: 100>>
    dbg: execute result: S{<CompiledInstance of <CompiledObject: <pybind11_builtins.pybind11_type object at 0x55be2f8f7278>>(<TreeArguments: <Number: 100>>)>} in <CompiledObject: <pybind11_builtins.pybind11_type object at 0x55be2f8f7278>>
   dbg: eval_expr_stmt result S{<CompiledInstance of <CompiledObject: <pybind11_builtins.pybind11_type object at 0x55be2f8f7278>>(<TreeArguments: <Number: 100>>)>}
  dbg: finder._names_to_types: [<TreeNameDefinition: string_name=bb start_pos=(3, 0)>] -> S{<CompiledInstance of <CompiledObject: <pybind11_builtins.pybind11_type object at 0x55be2f8f7278>>(<TreeArguments: <Number: 100>>)>}
 dbg: trailer completion contexts: S{<CompiledInstance of <CompiledObject: <pybind11_builtins.pybind11_type object at 0x55be2f8f7278>>(<TreeArguments: <Number: 100>>)>}

 dbg: Start: convert contexts
 dbg: End: convert contexts
dbg: End: completions

Почему джедай не возвращает завершение для экземпляра объекта bb? dir(bb) в оболочке работает и генерирует следующий вывод:

['__bool__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__len__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'capacity', 'clear', 'copy', 'data', 'desc', 'fill', 'from_int', 'marks', 'name', 'offset', 'pack', 'shadow', 'size', 'unpack']

ОБНОВЛЕНИЕ № 2 ПОДСКАЗКА: Интерпретатор джедай может выполнить нашу задачу:

script = jedi.Interpreter("bb.", [locals()])
script.completions() # this works

Мы заключаем, что с самим объектом проблем нет.

ОБНОВЛЕНИЕ № 3:

Автоматическое завершение объекта работает с джедаем 0.11.1, но не с 0.14.0. Мы предполагаем, что что-то сломано в более поздних версиях.

...