#python #python-3.x #ctypes
Вопрос:
Я хочу определить, является ли объект ввода функции ctypes
объектом. Похоже, что, основываясь на иерархии классов ctypes, существует класс ctypes
, от которого наследуются все объекты _CData
.
Я нашел его местоположение в _ctypes
исходном коде в строке 2911 _ctypes.c
, но я не могу import
найти его ни в ctypes
_ctypes
библиотеках или. Есть ли способ получить import
этот объект, чтобы я мог его использовать, или есть альтернативный способ проверить, является ли вход ctypes
объектом?
Комментарии:
1. Следовать цепочке базовых классов?
Ответ №1:
Список [Python.Документы]: ctypes — Библиотека внешних функций для Python.
_ктипы._CData не является общедоступным классом, который нельзя импортировать (!!! будьте осторожны, для этого может быть веская причина !!!) напрямую.
Однако мы можем получить его, используя обходной путь с использованием _ctypes._SimpleCData (также непубличная — согласно doc), которая является одним из его прямых потомков:
>>> import ctypes as ct >>> >>> ct.c_int.__mro__ (<class 'ctypes.c_int'>, <class '_ctypes._SimpleCData'>, <class '_ctypes._CData'>, <class 'object'>) >>> ct.Structure.__mro__ (<class '_ctypes.Structure'>, <class '_ctypes._CData'>, <class 'object'>) >>> ct._SimpleCData.__mro__ (<class '_ctypes._SimpleCData'>, <class '_ctypes._CData'>, <class 'object'>) >>> CData = ct._SimpleCData.__mro__[-2] >>> >>> CData, type(CData) (<class '_ctypes._CData'>, <class 'type'>) >>> >>> isinstance(ct.c_int(1), CData) True >>> >>> class S0(ct.Structure): pass ... >>> s0 = S0() >>> >>> isinstance(s0, CData) True >>> isinstance(s0, ct._SimpleCData) False
Комментарии:
1. Спасибо! Учитывая его ограниченный характер, если бы я использовал альтернативу, это был бы лучший способ?
isinstance(obj, (ctypes._SimpleCData, ctypes._Pointer, ctypes.Array, ctypes.Structure, ctypes.Union)):
Я не поклонник того, насколько это многословно.2. Согласно документам (и общеизвестным данным), все классы, начинающиеся с_, не являются общедоступными . Поэтому я не думаю, что перечислять их лучше (даже если они доступны через импорт).