Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 30, 2011 21:01:01

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

class Tx(ctypes.Structure): Structure - не базовый класс?

Хочется чуть чуть уменьшить писанину в следующем процессе:
из БД читается список полей класса и спецификатов типа (для ctypes)
далее полученный список передается для создания класса

def a(cls):
cls.__bases__=(ctypes.Structure,)
cls.a=5
cls._fields_=[("aaa",c_int)]
return cls


def f(lst):
@a(lst)
class Tm(ctypes.Structure):
pass
return Tm
на что резонно получаю по мозгам:
Traceback (most recent call last):
File “C:\PROJECTS\ake\usersoft\db\a.py”, line 23, in <module>
class Ta(Tc):
File “C:\PROJECTS\ake\usersoft\db\a.py”, line 18, in a
cls.__bases__=(ctypes.Structure,)
TypeError: __bases__ items must be classes

аналогично не получаю по мозгам от:
type("Ta",(Structure,),{"_fields_":[("aaa",c_int)]})]
Немного интригует вопрос - Structure не базовый класс? А кто он тогда?
Довольно странная диагностика отсутствия необходимых параметров класса.
МОжноли в готовый класс безболезненно насовать базовых классов?



Отредактировано (Июнь 30, 2011 21:11:07)

Офлайн

#2 Июнь 30, 2011 22:20:13

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

class Tx(ctypes.Structure): Structure - не базовый класс?

Structure — недокласс. У него нет __base__, __bases__, __mro__ — т.е. он не унаследован от type.
Можете смело писать баг, как мне кажется. Это недоработка в С коде.
__bases__ менять можно. Насколько смело — вам решать. Кажется, в cpython проблем нет. В остальных реализациях, уверен, будут — не любят они этого.
Можно похачить Structure, унаследовавшись и добавив необходимые поля, засунув его обратно манки-патчингом. В результате не уверен.



Офлайн

#3 Июнь 30, 2011 22:21:22

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

class Tx(ctypes.Structure): Structure - не базовый класс?

Если, конечно, я нигде не ошибаюсь.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version