0

在谷歌上花了几个小时后,我学到了很多东西,但没有找到与以下内容相近的话题:

我目前正在通过工厂方法对动态创建的类进行编程。原因是,方法名称应根据单独的 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 自动完成中得到了正确处理。

4

1 回答 1

0

这里是 Spyder 开发人员)抱歉,我们使用的完成库(称为rope )似乎无法对动态类和属性进行这种完成。

欢迎您在其邮件列表上询问有关此问题的信息,如果我们有什么可以做的,我们将很乐意提供帮助。

于 2014-07-07T21:10:58.190 回答