Skip to content

Add ctypes #454

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 17 commits into from
Aug 15, 2016
246 changes: 246 additions & 0 deletions stdlib/2and3/ctypes/__init__.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,246 @@
# Stubs for ctypes

from typing import (
Any, Callable, Iterable, Mapping, Optional, Sequence, Sized, Tuple, Type,
Generic, TypeVar, overload,
)
from typing import Union as UnionT
import sys

_T = TypeVar('_T')
if sys.platform == 'win32':
_DLLT = TypeVar('_DLLT', CDLL, OleDLL, WinDLL, PyDLL)
else:
_DLLT = TypeVar('_DLLT', CDLL, PyDLL)
_CT = TypeVar('_CT', _CData)


RTLD_GLOBAL = ... # type: int
RTLD_LOCAL = ... # type: int
DEFAULT_MODE = ... # type: int


class _DLL:
def __init__(self, name: str, mode: int = ..., handle: Optional[int] = ...,
use_errno: bool = ..., use_last_error: bool = ...) -> None: ...
def __getattr__(self, name: str) -> Any: ...
class CDLL(_DLL): ...
if sys.platform == 'win32':
class OleDLL(_DLL): ...
class WinDLL(_DLL): ...
class PyDLL(_DLL):
_handle = ... # type: int
_name = ... # type: str
def __init__(self, name: str, mode: int = ...,
handle: Optional[int] = ...) -> None: ...

class LibraryLoader(Generic[_DLLT]):
def __init__(self, dlltype: Type[_DLLT]) -> None: ...
def LoadLibrary(self, name: str) -> _DLLT: ...

cdll = ... # type: LibraryLoader[CDLL]
if sys.platform == 'win32':
windll = ... # type: LibraryLoader[WinDLL]
oledll = ... # type: LibraryLoader[OleDLL]
pydll = ... # type: LibraryLoader[PyDLL]
pythonapi = ... # type: PyDLL


_ECT = Callable[[Optional[Type[_CData]],
_FuncPtr,
Tuple[_CData, ...]],
_CData]
class _FuncPtr:
restype = ... # type: UnionT[Type[_CData], Callable[[int], None], None]
argtypes = ... # type: Tuple[Type[_CData], ...]
errcheck = ... # type: _ECT
def __call__(self, *args: Any, **kwargs: Any) -> Any: ...

class ArgumentError(Exception): ...


def CFUNCTYPE(restype: Type[_CData],
*argtypes: Type[_CData],
use_errno: bool = ...,
use_last_error: bool = ...) -> Type[_FuncProto]: ...
if sys.platform == 'win32':
def WINFUNCTYPE(restype: Type[_CData],
*argtypes: Type[_CData],
use_errno: bool = ...,
use_last_error: bool = ...) -> Type[_FuncProto]: ...
def PYFUNCTYPE(restype: Type[_CData],
*argtypes: Type[_CData]) -> Type[_FuncProto]: ...

_PF = UnionT[
Tuple[int],
Tuple[int, str],
Tuple[int, str, Any]
]

class _FuncProto(_FuncPtr):
@overload
def __init__(self, address: int) -> None: ...
@overload
def __init__(self, callable: Callable[..., Any]) -> None: ...
@overload
def __init__(self, func_spec: Tuple[UnionT[str, int], _DLL],
paramflags: Tuple[_PF, ...] = ...) -> None: ...
@overload
def __init__(self, vtlb_index: int, name: str,
paramflags: Tuple[_PF, ...] = ...,
iid: _Pointer[c_int] = ...) -> None: ...

class _cparam: ...

def addressof(obj: _CData) -> int: ...
def alignment(obj_or_type: UnionT[_CData, Type[_CData]]) -> int: ...
def byref(obj: _CData, offset: int = ...) -> _cparam: ...
def cast(obj: _CData, type: Type[_Pointer[Any]]) -> _CData: ...
def create_string_buffer(init_or_size: UnionT[int, bytes],
size: Optional[int] = ...) -> Array[c_char]: ...
c_buffer = create_string_buffer
def create_unicode_buffer(init_or_size: UnionT[int, str],
size: Optional[int] = ...) -> Array[c_wchar]: ...
if sys.platform == 'win32':
def DllCanUnloadNow() -> int: ...
def DllGetClassObject(rclsid: Any, riid: Any, ppv: Any) -> int: ... # TODO not documented
def FormatError(code: int) -> str: ...
def GetLastError() -> int: ...
def get_errno() -> int: ...
if sys.platform == 'win32':
def get_last_error() -> int: ...
def memmove(dst: UnionT[int, _CData],
src: UnionT[int, _CData],
count: int) -> None: ...
def memset(dst: UnionT[int, _CData],
c: int, count: int) -> None: ...
def POINTER(type: Type[_CT]) -> Type[_Pointer[_CT]]: ...
def pointer(obj: _CT) -> _Pointer[_CT]: ...
def resize(obj: _CData, size: int) -> None: ...
if sys.version_info < (3,):
def set_conversion_mode(encoding: str, errors: str) -> Tuple[str, str]: ...
def set_errno(value: int) -> int: ...
if sys.platform == 'win32':
def set_last_error(value: int) -> int: ...
def sizeof(obj_or_type: UnionT[_CData, Type[_CData]]) -> int: ...
def string_at(address: int, size: int = ...) -> bytes: ...
if sys.platform == 'win32':
def WinError(code: Optional[int] = ...,
desc: Optional[str] = ...) -> OSError: ...
def wstring_at(address: int, size: int = ...) -> str: ...


class _CData:
_b_base = ... # type: int
_b_needsfree_ = ... # type: bool
_objects = ... # type: Optional[Mapping[Any, int]]
def from_buffer(self, source: bytearray, offset: int) -> _CData: ...
def from_buffer_copy(self, source: bytearray, offset: int) -> _CData: ...
def from_address(self, address: int) -> _CData: ...
def from_param(self, obj: Any) -> UnionT[_CData, _cparam]: ...
def in_dll(self, library: str, name: _DLL) -> _CData: ...


class _SimpleCData(Generic[_T], _CData):
value = ... # type: _T
def __init__(self, value: _T = ...) -> None: ...

class c_byte(_SimpleCData[int]): ...

class c_char(_SimpleCData[bytes]): ...
class c_char_p(_SimpleCData[Optional[bytes]]):
def __init__(self, value: UnionT[int, bytes] = ...) -> None: ...

class c_double(_SimpleCData[float]): ...
class c_longdouble(_SimpleCData[float]): ...
class c_float(_SimpleCData[float]): ...

class c_int(_SimpleCData[int]): ...
class c_int8(_SimpleCData[int]): ...
class c_int16(_SimpleCData[int]): ...
class c_int32(_SimpleCData[int]): ...
class c_int64(_SimpleCData[int]): ...

class c_long(_SimpleCData[int]): ...
class c_longlong(_SimpleCData[int]): ...

class c_short(_SimpleCData[int]): ...

class c_size_t(_SimpleCData[int]): ...
class c_ssize_t(_SimpleCData[int]): ...

class c_ubyte(_SimpleCData[int]): ...

class c_uint(_SimpleCData[int]): ...
class c_uint8(_SimpleCData[int]): ...
class c_uint16(_SimpleCData[int]): ...
class c_uint32(_SimpleCData[int]): ...
class c_uint64(_SimpleCData[int]): ...

class c_ulong(_SimpleCData[int]): ...
class c_ulonglong(_SimpleCData[int]): ...

class c_ushort(_SimpleCData[int]): ...

class c_void_p(_SimpleCData[Optional[int]]): ...

class c_wchar(_SimpleCData[str]): ...
class c_wchar_p(_SimpleCData[Optional[str]]):
def __init__(self, value: UnionT[int, str] = ...) -> None: ...

class c_bool(_SimpleCData[bool]):
def __init__(self, value: bool) -> None: ...

if sys.platform == 'win32':
class HRESULT(_SimpleCData[Any]): ... # TODO undocumented

class py_object(Generic[_T], _SimpleCData[_T]): ...


class Union:
def __init__(self, *args: Any, **kw: Any) -> None: ...

class BigEndianStructure:
def __init__(self, *args: Any, **kw: Any) -> None: ...

class LittleEndianStructure:
def __init__(self, *args: Any, **kw: Any) -> None: ...

class Structure(_CData):
_fields_ = ... # type: Sequence[UnionT[Tuple[str, Type[_CData]], Tuple[str, Type[_CData], int]]]
_pack_ = ... # type: int
_anonymous_ = ... # type: Sequence[str]
def __init__(self, *args: Any, **kw: Any) -> None: ...
def __getattr__(self, name: str) -> Any: ... # TODO should be a classmethod
def __setattr__(self, name: str, value: Any) -> None: ...


class Array(Generic[_T], Sized, _CData):
_length_ = ... # type: int
_type_ = ... # type: Type[_T]
raw = ... # type: bytes # TODO only available with _T == c_char
value = ... # type: bytes # TODO only available with _T == c_char
def __init__(self, *args: _T) -> None: ...
@overload
def __getitem__(self, i: int) -> _T: ...
@overload
def __getitem__(self, s: slice) -> List[_T]: ...
@overload
def __setitem__(self, i: int, o: _T) -> None: ...
@overload
def __setitem__(self, s: slice, o: Iterable[_T]) -> None: ...
def __iter__(self) -> Iterable[_T]: ...


class _Pointer(Generic[_T], _CData):
_type_ = ... # type: Type[_T]
contents = ... # type: _T
def __init__(self, arg: _T = ...) -> None: ...
@overload
def __getitem__(self, i: int) -> _T: ...
@overload
def __getitem__(self, s: slice) -> List[_T]: ...
@overload
def __setitem__(self, i: int, o: _T) -> None: ...
@overload
def __setitem__(self, s: slice, o: Iterable[_T]) -> None: ...
8 changes: 8 additions & 0 deletions stdlib/2and3/ctypes/util.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Stubs for ctypes.util

from typing import Optional
import sys

def find_library(name: str) -> Optional[str]: ...
if sys.platform == 'win32':
def find_msvcrt() -> Optional[str]: ...
Empty file.