Найти - Пользователи
Полная версия: PyType_Check in python
Начало » Python для экспертов » PyType_Check in python
1
crchemist
в сішному апі є функція PyType_Check, який її аналог в пітоні?
є дві ф-ції isinstance і issubclass але вони видають не то. повинно видавати шось типу того
>>> class A(object):
...     """
...     """
...
>>> PyType_Check(A())
False
>>> PyType_Check(dict())
True
можливо я не правильно викликаю isinstance і issubclass:
>>> issubclass(dict, type)
False
>>> isinstance(dict(), type)
False
>>> isinstance(A(), type)
False
>>> issubclass(dict, type)
False
>>> issubclass(A, type)
False

кусок сішного коду:
   /* Sanity check the value given to make sure it is allowed in the cache */
    if (PyType_Check(v)) {
        /* Its a persistent class, such as a ZClass. Thats ok. */
    }
    else if (v->ob_type->tp_basicsize < sizeof(cPersistentObject)) {
        /* If it's not an instance of a persistent class, (ie Python
	   classes that derive from persistent.Persistent, BTrees,
	   etc), report an error.
	   TODO:  checking sizeof() seems a poor test.
	*/
	PyErr_SetString(PyExc_TypeError,
			"Cache values must be persistent objects.");
	return -1;
    }
ZAN
В общем, мне конечно все равно - не мне же нужна помощь, но используя украинский, сужается круг людей, которые смогут вникнуть в проблему.
http://python.su/forum/viewtopic.php?id=386 (первый пункт рекоммендаций)
Андрей Светлов
Работает isinstance(dict, type).
Класс dict - не подкласс, а экземпляр метакласса type
crchemist
>>> class A(object):
...             ""
>>> isinstance(dict, type)
True
>>> isinstance(A, type)
True
тра шоб для A повертало фолс
Андрей Светлов
класс A тоже инстанция метакласса type - и тут ничего не поделаешь :)
Может, тебе какой другой тест нужен?
crchemist
Андрей Светлов
класс A тоже инстанция метакласса type - и тут ничего не поделаешь :)
Может, тебе какой другой тест нужен?
Сорі, вже розібрався, я помилився - в мене в іншому місці вилітала помилка. А PyType_Check на пітоні буде виглядати так:
>>> a = A()
>>> (type(a) == types.TypeType) or issubclass(a.__class__,  types.TypeType)
Андрей Светлов
types.TypeType на самом деле просто type
другими словами

>>> a = A()
>>> (type(a) == type) or issubclass(a.__class__, type)
что не отличается от
>>> isinstance(a, type)

кстати, для экземпляра проверка не проходит, а для класса - в самый раз


>>> class A(object):
… pass
>>> a = A()
>>> (type(a) == types.TypeType) or issubclass(a.__class__, types.TypeType)
False
>>> (type(a) == type) or issubclass(a.__class__, type)
False
>>> isinstance(a, type)
False
>>> (type(A) == types.TypeType) or issubclass(A.__class__, types.TypeType)
True
>>> (type(A) == type) or issubclass(A.__class__, type)
True
>>> isinstance(A, type)
True
crchemist
ну між цим
(type(a) == types.TypeType) or issubclass(a.__class__,  types.TypeType)
і цим
(type(a) == type) or issubclass(a.__class__,  type)
нема ніякої різниці - в types.py написано так: TypeType = type Я пишу types.TypeType для нагдяності ) А за isinstance(A, type) дякую
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB