meta confusion new.instance() argument 1 must be classobj, not type

Roeland Rengelink roeland.rengelink at chello.nl
Tue Jun 22 19:13:43 EDT 2004


Brad Clements wrote:
> I need to dynamically create a new type of class at runtime, based on an
> oldstyle class and a new style class.
> 
> I'm using Python 2.3.2
> 
> My code:
> 
> def shipment_from_db_instance(db_shipment):
>     """
>         Create a new shipment object from a db_shipment instance (old style)
>     """
>     global _new_shipment_factory
>     if not _new_shipment_factory:
>         # create a new shipment factory dynamically
>         _new_shipment_factory = type('NewShipment', (Shipment,
> db_shipment.__class__), {})
>         print "factory is ", _new_shipment_factory,
> type(_new_shipment_factory)
>     return new.instance(_new_shipment_factory, db_shipment.__dict__)
> 
> But I get this output:
> factory is  <class 'MurkWorks.Shipments.Shipment.NewShipment'> <type 'type'>
> 
>   File "/home/bkc/src/Python/MurkWorks/Shipments/Shipment.py", line 81, in
> shipment_from_db_instance
>     return new.instance(_new_shipment_factory, db_shipment.__dict__)
> TypeError: instance() argument 1 must be classobj, not type
> 
> It seems that new.instance() doesn't understand how to make instances from
> types.
> 
> 

I don't know if it's a bug, but I think this alternative will work.

i = object.__new__(_new_shipment_factory)
i.__dict__.update(db_shipment.__dict__)
return i

Hope this help,

-- 
Roeland Rengelink

Author of PyORQ (http://pyorq.sourceforge.net), an Object-Relational 
binding that lets you write queries as Python expression

'half of what I say is nonsense, unfortunately I don't know which half'



More information about the Python-list mailing list