2011-07-23 5 views
1

これは矛盾である。ctypesの属性にアクセスする方法ctypesであり、指定されたラッパーを経由しない場合と同様に構造化しますか?

<__main__.LP_c_int object at 0x10d3d08c0> 
0 

を返し

from ctypes import * 

class S(Structure): 
    _fields_ = [("x", POINTER(c_int)), ("y", c_int)] 

o = S() 
print o.x 
print o.y 

そこで一つの場合には、他の場合には、直接値を返し、​​タイプを返します。

私はいつも​​タイプのインスタンスを渡す必要があるより一般的なコードを持っています(これは書き込み可能です。つまり、書き込み可能です。上記の例ではoを変更することを意味します)。 o.xについては、これは問題ありません。しかし、o.yではありません。

c_intのインスタンスをo.yにするにはどうすればよいですか?

+4

あなたのタイトルをタグ付けを停止してください。 –

+0

@Tomalak Geret'kal:私は彼らがこの方法ではるかに役に立つ/分かりやすいと思う。また、タグ付けは若干異なります。タギングは、この質問が何に関連しているかを定義します(それ以上は何もありません)。それをタイトルに追加することによって、質問のトピックも定義します。何かが話題であると言っているのは、それが関連しているというだけではなく、より多くの情報です。 – Albert

+1

タイトルにタグを書き込むことは冗長です。われわれは既に明確で、簡潔で、一貫性があり、索引付け可能なタグ付けシステムを持っている。あなたのタイトルの冒頭に無意味な 'Python:'を書くことによってあなたがしているのは、あなたのタイトルバーに見えるSOの期待を破り、あなたのタイトルに厄介なノイズを加え、私を巻き上げることです。 「タイトル」フィールドは、その理由で名前が付けられています。いくつかの "トピック"ではなく、タイトルを書きます。それ以上のものはありません。 SOは掲示板やチャットフォーラムではありません。 (そして、私は "Python"を書くことが "Python"を書くよりも "もっと情報"であることに気づいていません)。 –

答えて

1

ソースは_ctypesソースから、ラップされた単純なctypesインスタンスの場合は、この巧妙な自動変換が行われないようです。

だから、1(醜い)ソリューションはこれです:それは「標準」タイプのためだけ異なるのrepr方法だろうけれども、私が最初に

from ctypes import * 

def WrapClass(c): 
    class C(c): pass 
    C.__name__ = "wrapped_" + c.__name__ 
    return C 

class S(Structure): 
    _fields_ = [("x", POINTER(c_int)), ("y", WrapClass(c_int))] 

o = S() 
print o.x 
print o.y 
print o.y.value 
0

が、いくつかのテストの後、私は何かがあると思います間違いなくそこに行くファンキー。何かが構造内にあるかどうかにかかわらず、実際には違いがあります。特に

from ctypes import * 

class S(Structure): 
    _fields_ = [("x", POINTER(c_int)), ("y", c_int), ("z", c_float)] 

o = S() 

x = POINTER(c_int) 
y = c_int(1) 
z = c_float(2.2) 

print("In structure: x:{}, y:{}, z:{}".format(o.x, o.y, o.z)) 
print("Out of structure: x:{}, y:{}, z:{}".format(x, y, z)) 

In structure: x:<main.LP_c_long object at 0x000000000A090EC8>, y:0, z:0.0

Out of structure: x:, y:c_long(1), z:c_float(2.200000047683716)

、私はこれはバグの行動とみなされるべきだと思う:

o.x.contents = y #OK 
o.x.contents = o.y #not OK!! 

Traceback (most recent call last): File "", line 1, in TypeError: expected c_long instead of int

関連する問題