argtypes属性を設定することによって、 DLLからエクスポートされている関数に要求される引数の型を指定することができます。
argtypesはCデータ型のシーケンスでなければなりません(この場合
printf
関数はおそらく良い例ではありません。なぜなら、
引数の数が可変であり、フォーマット文字列に依存した異なる型の
パラメータを取るからです。一方では、この機能の実験には
とても便利です):
>>> printf.argtypes = [c_char_p, c_char_p, c_int, c_double] >>> printf("String '%s', Int %d, Double %f\n", "Hi", 10, 2.2) String 'Hi', Int 10, Double 2.200000 37 >>>
(Cの関数のプロトタイプのように)書式を指定すると互換性のない引数型になるのを防ぎ、 引数を有効な型へ変換しようとします:
>>> printf("%d %d %d", 1, 2, 3) Traceback (most recent call last): File "<stdin>", line 1, in ? ArgumentError: argument 2: exceptions.TypeError: wrong type >>> printf("%s %d %f", "X", 2, 3) X 2 3.00000012 12 >>>
関数呼び出しへ渡す自作のクラスを定義した場合には、
argtypesシーケンスの中で使えるようにするために、
そのクラスにfrom_paramクラスメソッドを実装しなければなりません。
from_paramクラスメソッドは関数呼び出しへ渡された
Pythonオブジェクトを受け取り、型チェックもしくはこのオブジェクトが受け入れ可能であると
確かめるために必要なことはすべて行ってから、オブジェクト自身、
_as_parameter_属性、あるいは、この場合に
C関数引数として渡したい何かの値を返さなければなりません。
繰り返しになりますが、その返される結果は整数、文字列、ユニコード、ctypes
インスタンス、
あるいは_as_parameter_属性をもつものであるべきです。
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。