2017-03-03 69 views
0

Python IDE(任何)智能感知如何在设计时发现结构成员?Ctypes结构自动完成

class MY_STRUCTURE(ctypes.Structure): 
     _fields_ = [("member1", c_int), 
        ("member2", c_int)] 

     #Any idea declare the fields like self.member1 here inside the structure? 

    my_structure = MY_STRUCTURE() 
    my_structure.member1 = 0 

这是O.K在运行,但没有任何方法,智能感知,以检测存在my_structure内的member1打字时“my_structure。” ?

为此目的,我创建了一个由相同成员名称组成的python包装类,并在需要时均衡/绑定它们。但我觉得这是一个肮脏的方式。

如果将ctypes结构编译为字节码(无源代码),我将分发一个python SDK,那么对于用户不会有任何想法如果没有提供额外的文档,结构的成员是什么。这将使开发人员和用户的工作更加复杂。

+1

我不确定你想知道什么。逐字采取,答案当然是“是”,IDE有这样一种方法来检测结构中是否有'member1'。那是你想知道的吗?当你键入my_structure时,输入 – Alfe

+0

。 (通知'。'),成员未在自动代码完成窗口中列出。 – freewill

+1

在我的标准cpython安装(终端,只输入'python'),完成工作得很好,'member1'与其他十几个人一起提出。所以,是的,IDE也可以做到这一点。但我敢肯定,“是”不是你想知道的。请重新提出您的问题,以便我们知道您真正想要查明的内容。 – Alfe

回答

0

我从@Alfe回答了解到,这取决于IDE。 Python IDLE在设计时找到结构的成员。 PyCharm不能。

我以下面的方式使用我的结构,看起来工作正常。通过这种方式,ctypes.structure也可以用python类的特性进行扩展。

import ctypes 
from ctypes import * 

    class MY_STRUCTURE(ctypes.Structure): 
     def __init__(self): 
      self.member1 = 1 
      self.member2 = 2 
      super().__init__(member1=self.member1, 
         member2=self.member2) 

     _fields_ = [("member1", c_int), 
        ("member2", c_int)] 

这里的关键是调用super()基类。