Форум сайта python.su
в сішному апі є функція PyType_Check, який її аналог в пітоні?
є дві ф-ції isinstance і issubclass але вони видають не то. повинно видавати шось типу того
>>> class A(object): ... """ ... """ ... >>> PyType_Check(A()) False >>> PyType_Check(dict()) True
>>> 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; }
Отредактировано (Июль 10, 2008 18:06:23)
Офлайн
В общем, мне конечно все равно - не мне же нужна помощь, но используя украинский, сужается круг людей, которые смогут вникнуть в проблему.
http://python.su/forum/viewtopic.php?id=386 (первый пункт рекоммендаций)
Офлайн
Работает isinstance(dict, type).
Класс dict - не подкласс, а экземпляр метакласса type
Офлайн
>>> class A(object): ... "" >>> isinstance(dict, type) True >>> isinstance(A, type) True
Офлайн
класс A тоже инстанция метакласса type - и тут ничего не поделаешь :)
Может, тебе какой другой тест нужен?
Офлайн
Андрей СветловСорі, вже розібрався, я помилився - в мене в іншому місці вилітала помилка. А PyType_Check на пітоні буде виглядати так:
класс A тоже инстанция метакласса type - и тут ничего не поделаешь :)
Может, тебе какой другой тест нужен?
>>> 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
Отредактировано (Июль 10, 2008 22:59:19)
Офлайн
ну між цим
(type(a) == types.TypeType) or issubclass(a.__class__, types.TypeType)
(type(a) == type) or issubclass(a.__class__, type)
Офлайн