Определите, является ли входной объект объектом ctypes?

#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. Согласно документам (и общеизвестным данным), все классы, начинающиеся с_, не являются общедоступными . Поэтому я не думаю, что перечислять их лучше (даже если они доступны через импорт).