автозаполнение редактора python spyder и проверка измененных классов с помощью setattr

#python #autocomplete #spyder #setattr #code-inspection

#python #автозаполнение #spyder #setattr #проверка кода

Вопрос:

потратив несколько часов на поиск в Google, я многому научился, но не нашел ни одной близкой темы к следующей:

В настоящее время я программирую на динамически создаваемых классах с помощью заводского метода. Причина в том, что имена методов должны быть заполнены в соответствии с отдельным yaml-файлом. Это сводится к этой проблеме:

 def create_class_with_dynamic_fuction_name(fun_name):
    def fun(self):
        print "Hello, I am fun"

    class X:
        pass

    setattr(X, fun_name, fun)
    return X

Kls1= create_class_with_dynamic_fuction_name('my_function_name')
kls1= Kls1()
kls1.my_function_name()
  

Этот код работает. Однако, если у вас есть этот код в редакторе sypder (он же. Spider IDE, spyderlib), автозаполнение не будет отображаться my_function_name в его контекстном окне. Также невозможно проверить это через Ctrl I для удобства поиска docstring-help.

Та же проблема возникает, если класс создается с помощью type(classname, (), clsdict) . В этом случае можно найти только mro внутри контекстного меню автозаполнения.

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

 def create_class_with_static_function_name():
    def fun(self):
        print "Hello, I am fun"

    class X:
        my_function_name = fun

    return X

Kls2= create_class_with_static_function_name()
kls2= Kls2()
kls2.my_function_name()
  

В таком случае my_function_name отображается правильно, но это не то, к чему я стремился.

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

Ответ №1:

(Здесь разработчик Spyder) Извините, похоже, что используемая нами библиотека завершения (называемая rope) не может выполнять такого рода доработки для динамических классов и атрибутов.

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

Комментарии:

1. Спасибо за ваш ответ. Мне также стало ясно, что rope не может обеспечить такого рода функциональность. Однако было бы интересной идеей, если бы редактор можно было дополнительно подключить к текущему интерпретатору, чтобы вместо него использовались контекстные меню интерпретатора. Просто идея на стороне.

2. Я думаю, что Canopy , среда, похожая на Spyder, работает таким образом. Может быть, вы сможете взглянуть на это.