Уведомления

Группа в Telegram: @pythonsu

#1 Июль 10, 2008 18:02:29

crchemist
От:
Зарегистрирован: 2008-07-09
Сообщения: 379
Репутация: +  0  -
Профиль   Отправить e-mail  

PyType_Check in python

в сішному апі є функція 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;
    }



Отредактировано (Июль 10, 2008 18:06:23)

Офлайн

#2 Июль 10, 2008 18:10:15

ZAN
От:
Зарегистрирован: 2007-06-10
Сообщения: 403
Репутация: +  10  -
Профиль   Отправить e-mail  

PyType_Check in python

В общем, мне конечно все равно - не мне же нужна помощь, но используя украинский, сужается круг людей, которые смогут вникнуть в проблему.
http://python.su/forum/viewtopic.php?id=386 (первый пункт рекоммендаций)



Офлайн

#3 Июль 10, 2008 18:25:15

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

PyType_Check in python

Работает isinstance(dict, type).
Класс dict - не подкласс, а экземпляр метакласса type



Офлайн

#4 Июль 10, 2008 18:28:25

crchemist
От:
Зарегистрирован: 2008-07-09
Сообщения: 379
Репутация: +  0  -
Профиль   Отправить e-mail  

PyType_Check in python

>>> class A(object):
...             ""
>>> isinstance(dict, type)
True
>>> isinstance(A, type)
True
тра шоб для A повертало фолс



Офлайн

#5 Июль 10, 2008 20:46:16

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

PyType_Check in python

класс A тоже инстанция метакласса type - и тут ничего не поделаешь :)
Может, тебе какой другой тест нужен?



Офлайн

#6 Июль 10, 2008 21:42:33

crchemist
От:
Зарегистрирован: 2008-07-09
Сообщения: 379
Репутация: +  0  -
Профиль   Отправить e-mail  

PyType_Check in python

Андрей Светлов
класс A тоже инстанция метакласса type - и тут ничего не поделаешь :)
Может, тебе какой другой тест нужен?
Сорі, вже розібрався, я помилився - в мене в іншому місці вилітала помилка. А PyType_Check на пітоні буде виглядати так:
>>> a = A()
>>> (type(a) == types.TypeType) or issubclass(a.__class__,  types.TypeType)



Офлайн

#7 Июль 10, 2008 22:39:14

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

PyType_Check in python

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)

Офлайн

#8 Июль 11, 2008 13:01:50

crchemist
От:
Зарегистрирован: 2008-07-09
Сообщения: 379
Репутация: +  0  -
Профиль   Отправить e-mail  

PyType_Check in python

ну між цим

(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) дякую



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version