python spyder编辑器对使用setattr修改类的自动完成和检查
我花了好几个小时在网上查资料,学到了很多东西,但没找到和我下面要说的内容相关的主题:
我现在正在通过工厂方法编程,动态创建类。这样做的原因是,方法名需要根据一个单独的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
也无法查看它的文档说明。
如果用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 个回答
0
(这里是Spyder开发者) 很抱歉,我们使用的补全库(叫做 rope)似乎无法对动态类和属性进行这种类型的补全。
你可以在它的邮件列表上询问这个问题,如果我们这边能做些什么,我们会很乐意提供帮助。