2012-05-22 32 views
2

我正在玩一些ctypes來按摩一些我寫入Python的C代碼。 C代碼在很大程度上依賴於結構和聯合,現在來看,在Python的快速的解決方案是子類通過ctypes的那些:在ctypes子類上使用__repr __()?

即,從這樣的:

struct foo { 
    uint32_t a; 
    uint32_t b; 
    uint16_t c; 
    uint16_t d; 
}; 


要這樣:

from ctypes import * 

class Foo(Structure): 
    _fields_ = [("a", c_uint), 
       ("b", c_uint), 
       ("c", c_ushort), 
       ("d", c_ushort)] 

除此之外,如果我折騰了__repr__()定義到Python類,然後在實例中使用repr(),所有我得到的回覆是<class 'Foo'>(或類似的意思,R從這裏回憶一下)。

所以我想知道是否有利用repr(),並嘗試以獲得最佳的Python和C之間,或兩全其美的方式,如果我應該看看元類和使用struct庫包裝/解壓縮字節到正確的Python類。

想法?

回答

2

我真的不明白這個問題。 這只是正常:

from ctypes import * 

class Foo(Structure): 
    _fields_ = [("a", c_uint), 
       ("b", c_uint), 
       ("c", c_ushort), 
       ("d", c_ushort)] 

    def __repr__(self): 
     return "<Foo: a:%d b:%d c:%d e:%d>" % (self.a, self.b, self.c, self.d) 

f = Foo(1,2,3,4) 
print repr(f) 

# <Foo: a:1 b:2 c:3 e:4> 

只有當你這樣做:

print repr(Foo) 

你會

<class '__main__.Foo'> 

或類似的東西而告終。

您確定您在實例上使用了repr嗎?

+0

那麼,我手動爲它建立ctypes之後,在Python 2.4上執行此操作。可能是問題的一部分? – Kumba

+0

不知何故,我發現不太可能,我只是[嘗試](http://pastie.org/3952521)在一臺服務器與python2.4,它的工作。 – mata

+0

好吧,粉筆這一個到PEBKAC或PICNIC。我在做'f = Foo',而不是'f = Foo()'。 Herp derp。 – Kumba