#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, работает таким образом. Может быть, вы сможете взглянуть на это.