Python eclipse';pydev是否完成了代码?
有人知道pydev如何决定代码完成时使用什么吗?我正试图定义一组专门用于实现代码完成的类。我试过使用Python eclipse';pydev是否完成了代码?,python,eclipse,pydev,metaclass,Python,Eclipse,Pydev,Metaclass,有人知道pydev如何决定代码完成时使用什么吗?我正试图定义一组专门用于实现代码完成的类。我试过使用\uuuuu new\uuuu来设置\uuuu dict\uuu和\uuuuuu slots\uuu,但这两种设置似乎都没有在pydev自动完成中列出 我想在autocomplete中列出一组枚举,但我想在生成器中设置它们,而不是为每个类硬编码它们 所以而不是 class TypeA(object): ValOk = 1 ValSomethingSpecificToThisClas
\uuuuu new\uuuu
来设置\uuuu dict\uuu
和\uuuuuu slots\uuu
,但这两种设置似乎都没有在pydev自动完成中列出
我想在autocomplete中列出一组枚举,但我想在生成器中设置它们,而不是为每个类硬编码它们
所以而不是
class TypeA(object):
ValOk = 1
ValSomethingSpecificToThisClassWentWrong = 4
def __call__(self):
return 42
我想做点像
def TYPE_GEN(name, val, enums={}):
def call(self):
return val
dct = {}
dct["__call__"] = call
dct['__slots__'] = enums.keys()
for k, v in enums.items():
dct[k] = v
return type(name, (), dct)
TypeA = TYPE_GEN("TypeA",42,{"ValOk":1,"ValSomethingSpecificToThisClassWentWrong":4})
我可以做些什么来帮助处理
编辑:
这些评论似乎是在质疑我在做什么。同样,我所追求的很大一部分是代码完成。我正在使用python绑定到一个协议来与各种微控制器通信。我可以更改的每个参数(有数百个)在概念上都有一个名称,但在协议上我需要使用它的ID,这实际上是随机的。许多参数接受概念上命名的值,但同样由整数表示。因此,enum
我正在尝试为库自动生成一个python模块,这样团队就可以使用名称而不是容易出错的数字来指定要更改的内容。\uuuu call\uuu
属性将返回参数的id,枚举是参数的允许值
是的,我可以生成每个类的详细版本。对我来说,每种类型一行似乎更清楚,因为重点是自动完成,而不是查看这些类。代码越简单,完成的可能性就越大。将它作为一个单独的工具来生成包含上述类定义的Python代码文件是否合理?这基本上是两全其美。您甚至可以将名称/值对放在JSON或INI文件或您拥有的其他文件中,消除名称/值对中方法调用的混乱。唯一的缺点是需要在代码更改时运行该工具来重新生成代码文件,但至少这是一个自动化的、简单的过程 就我个人而言,我只会让事情变得更加冗长,并手动编写类,但这只是我的观点
另一方面,我认为使类可调用与只使用
id
class变量相比没有什么好处。两者都需要知道键入什么:TypeA()
vsTypeA.id
。如果您想阻止实例化,我认为在\uuuu init\uuuu
中抛出异常会更清楚您的意图。在“脱机”编辑器中(与交互式Python shell相反)实际上不可能完全完成Python的通用代码
原因是Python过于动态;基本上,任何事情都可以随时改变。如果我键入TypeA.Val
并要求完成,系统必须知道TypeA
绑定到什么对象,它的类是什么,以及两者的属性是什么。所有这三个事实都可以更改(并且do;TypeA
未定义开始,并且仅在程序执行期间的某个特定点绑定到对象)
因此,系统必须知道程序运行的哪个点需要完成?即使有一些明确的方法来指定,也没有通用的方法可以知道程序中所有内容在该点的状态,而不实际运行到该点,这可能是您不希望编辑器执行的
所以pydev所做的是猜测,当它非常明显的时候。如果在定义类的模块foo
中有一个类块Bar
,那么从foo
导入的名称Bar
肯定会引用该类。因此,您知道在Bar.
下或在obj=Bar()
创建的对象上可以访问哪些名称。当然,该程序可以在运行时重新绑定foo.Bar
(或更改其属性集),也可以在import foo
命中其他文件的环境中运行。但这类事情很少发生,在一般情况下,补全是有用的
但这意味着,当您使用“太多”Python的动态语言灵活性时,基本上会丢失补全。通过调用函数定义类就是其中之一。它还没有准备好猜测TypeA
有名称ValOk
和valsomethingsspecificTothisClassWentRong
;毕竟,对TYPE\u GEN
的调用可能会产生许多其他对象,但它们都有不同的名称
因此,如果您的主要目标是完成,那么我认为您必须简化pydev并完整地编写这些类。当然,如果需要,可以使用类似的代码(文本)生成python文件。不过,看起来用字典定义它们的“语法开销”要比用类定义它们的“语法开销”更多;您正在为每个项目编写
“a”:b,
,而不是a=b
。除非您能够更系统地生成这些定义或解析现有的定义文件或其他东西,否则我认为静态类定义比字典驱动的TYPE\u GEN
更易于阅读和编写。好的,正如前面所指出的,您的代码太动态了。。。PyDev将只静态地分析您自己的代码(即:存在于项目中的代码)
不过,还有一些替代方案:
选项1:
您可以强制PyDev动态分析库中的代码(即:站点包中的代码),在这种情况下,它可以通过shell动态地获取该信息
为此,您必须在站点包中创建一个模块,在解释器配置中,您需要将其添加到“强制内置”中。有关详细信息,请参阅
选项2:
<