Login | Register For Free | Help
Search for: (Advanced)

Mailing List Archive: Python: Python

Python C api: create a new object class

 

 

Python python RSS feed   Index | Next | Previous | View Threaded


lallous at lgwm

Nov 10, 2009, 11:09 AM

Post #1 of 4 (229 views)
Permalink
Python C api: create a new object class

Hello

I have 3 questions, hope someone can help:

1)
How can I create an instance class in Python, currently I do:

class empty:
pass

Then anytime I want that class (which I treat like a dictionary):

o = empty()
o.myattr = 1
etc....

Is there is a one line syntax to instantiate an instance?

Any other ways than this:
o = new.classobj('object', (), {})

2)

How can I, similarly, create an object "o" in C api:

PyObject *o = what_to_call(....)

....
PyObject_SetAttrString(o, "attrname", py_val)

...

One way I found was first calling PyClass_New() (to create an empty class)
and then passing the return value to PyInstance_NewRaw to get a new instance
of that empty class.

Can I achieve the same otherwise?

3)

Given a PyObject* is there is a way to tell if one can call
PyObject_SetAttrString() on that object w/o getting an error?

For example, before calling a PyObject* one can see if it is callable, but
can I test if an object supports setattr?

(from C api)

Thank you,

Elias

--
http://mail.python.org/mailman/listinfo/python-list


martin at v

Nov 10, 2009, 2:17 PM

Post #2 of 4 (213 views)
Permalink
Re: Python C api: create a new object class [In reply to]

> How can I create an instance class in Python, currently I do:
>
> class empty:
> pass
>
> Then anytime I want that class (which I treat like a dictionary):
>
> o = empty()
> o.myattr = 1
> etc....
>
> Is there is a one line syntax to instantiate an instance?
>
> Any other ways than this:
> o = new.classobj('object', (), {})

Most certainly:

o = empty(1) # or: o = empty(1, etc)

This requires you to define

class empty:
def __init__(self, myattr, etc):
self.myattr = myattr
etc

> 2)
>
> How can I, similarly, create an object "o" in C api:
>
> PyObject *o = what_to_call(....)

o = PyObject_CallFunction(pointer_to_class_object, "")

> 3)
>
> Given a PyObject* is there is a way to tell if one can call
> PyObject_SetAttrString() on that object w/o getting an error?
>
> For example, before calling a PyObject* one can see if it is callable,
> but can I test if an object supports setattr?
>
> (from C api)

You could check whether the object supports setattr at all, but that
would be pretty useless, since most objects do.

What you want to test (would it support setting "myattr" to the specific
value, at this point) is impossible to test: the object may give you
an exception on every third call only (or only if the value is not
an integer, etc). So just call SetAttr, and clear any exception you
get that you don't want to get.

Regards,
Martin
--
http://mail.python.org/mailman/listinfo/python-list


benjamin at python

Nov 10, 2009, 2:20 PM

Post #3 of 4 (216 views)
Permalink
Re: Python C api: create a new object class [In reply to]

lallous <lallous <at> lgwm.org> writes:
> Is there is a one line syntax to instantiate an instance?

You can't instantiate an instance; it's already instantiated.

>
> Any other ways than this:
> o = new.classobj('object', (), {})

class x: pass

> How can I, similarly, create an object "o" in C api:

Use PyObject_CallFunction(PyType_Type, [arguments])


> Given a PyObject* is there is a way to tell if one can call
> PyObject_SetAttrString() on that object w/o getting an error?

No.




--
http://mail.python.org/mailman/listinfo/python-list


samwyse at gmail

Nov 11, 2009, 5:26 AM

Post #4 of 4 (204 views)
Permalink
Re: Python C api: create a new object class [In reply to]

On Nov 10, 1:09 pm, "lallous" <lall...@lgwm.org> wrote:
> Hello
>
> I have 3 questions, hope someone can help:
>
> 1)
> How can I create an instance class in Python, currently I do:
>
> class empty:
>   pass
>
> Then anytime I want that class (which I treat like a dictionary):
>
> o = empty()
> o.myattr = 1
> etc....
>
> Is there is a one line syntax to instantiate an instance?

I think that you want this:

class c(object):
def __init__(self, **kwds):
self.__dict__ = kwds

x = c(a=1, b=2)
print x.a, x.b
--
http://mail.python.org/mailman/listinfo/python-list

Python python RSS feed   Index | Next | Previous | View Threaded
 
 


Interested in having your list archived? Contact Gossamer Threads
 
  Web Applications & Managed Hosting Powered by Gossamer Threads Inc.