python spyder编辑器对使用setattr修改类的自动完成和检查

0 投票
1 回答
4849 浏览
提问于 2025-04-18 12:07

我花了好几个小时在网上查资料,学到了很多东西,但没找到和我下面要说的内容相关的主题:

我现在正在通过工厂方法编程,动态创建类。这样做的原因是,方法名需要根据一个单独的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)似乎无法对动态类和属性进行这种类型的补全。

你可以在它的邮件列表上询问这个问题,如果我们这边能做些什么,我们会很乐意提供帮助。

撰写回答