Запретить автоматическое преобразование типов в функциях обратного вызова ctypes - PullRequest
6 голосов
/ 08 июня 2011

Оборачивая функции Python с типом CFUNCTYPE, я обнаружил, что типы без указателей автоматически преобразуются, как если бы был вызван их атрибут value.

Как я могу подавить это автоматическое преобразование?

from ctypes import *

funcspec = CFUNCTYPE(c_int, c_int, POINTER(c_int))

@funcspec
def callback(the_int, the_int_p):
    print(vars())
    return 3

print(callback(c_int(1), byref(c_int(2))))

Который производит (python3cfunctype_type_conversion.py):

{'the_int': 1, 'the_int_p': <__main__.LP_c_int object at 0x2671830>}
3

I 'мне нравится:

{'the_int': c_int(1), 'the_int_p': <__main__.LP_c_int object at 0x2671830>}
c_int(3)

Ответы [ 2 ]

2 голосов
/ 04 июля 2011

Это что-то вроде хака, но это может сработать для вас. Надеюсь, кто-то еще станет более чистым ...

from ctypes import *

class c_int_hack(c_int):
    def from_param(self, *args):
        return self

funcspec = CFUNCTYPE(c_int, c_int_hack, POINTER(c_int))

@funcspec
def callback(the_int, the_int_p):
    print(vars())
    print(the_int.value)
    return 3

print(callback(c_int(1), byref(c_int(2))))

.. и вывод:

{'the_int': <c_int_hack object at 0xb7478b6c>, 'the_int_p': <__main__.LP_c_long object at 0xb747892c>}
1
3
0 голосов
/ 04 июля 2011

Я недавно просматривал код ctypes, подумал, что смогу разобраться с этим.Код c, который делает это, находится в callproc.c (вот источник для 2.7.2 ).

Соответствующий комментарий от источника:

5 .Если присутствуют 'преобразователи' (преобразователи - это последовательность методов argtypes 'from_param), для каждого элемента в' callargs 'вызывается преобразователь и результат передается в ConvParam.Если «конвертеры» отсутствуют, каждый аргумент напрямую передается в ConvParm.

Это в значительной степени то, что сказал Люк, так что то, что он дал, вероятно, не хак.

...