471,353 Members | 1,681 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 471,353 software developers and data experts.

Does PyModule_GetDict return information about class method variables?

MD
Hi,

I have a variable which is defined inside a class method. When I
call PyModule_GetDict on the module containing this class, the
dictionary doesn't contain any information about this variable. Is
this expected behavior? If so, what options do I have to access this
variable from my Python C extension.

Thanks and Regards,
-MD

Aug 10 '07 #1
3 2727
On Thu, 09 Aug 2007 19:34:37 -0700, MD wrote:
I have a variable which is defined inside a class method. When I
call PyModule_GetDict on the module containing this class, the
dictionary doesn't contain any information about this variable. Is
this expected behavior? If so, what options do I have to access this
variable from my Python C extension.
You can't access names in methods because they don't exist until you call
the method. It's just like local variables in C. Consider:

void foo(void)
{
int bar = 42;
}

Here `bar` does not exist until you call `foo()` and it disappears as soon
as the function returns.

It's the very same situation in Python:

class A(object):
def foo(self):
bar = 42

The local name `bar` only exists if `foo()` is called on an instance of `A`.

Ciao,
Marc 'BlackJack' Rintsch
Aug 10 '07 #2
MD
Hi Marc,
Thanks for your reply. I am calling my extension function from the
class method itself. So at that point the variable does exist. I am
puzzled why PyModule_GetDict is not able to access the variable even
though it does exist at that point.

Thanks,
-Manas

On Aug 10, 12:43 am, Marc 'BlackJack' Rintsch <bj_...@gmx.netwrote:
On Thu, 09 Aug 2007 19:34:37 -0700, MD wrote:
I have a variable which is defined inside a class method. When I
call PyModule_GetDict on the module containing this class, the
dictionary doesn't contain any information about this variable. Is
this expected behavior? If so, what options do I have to access this
variable from my Python C extension.

You can't access names in methods because they don't exist until you call
the method. It's just like local variables in C. Consider:

void foo(void)
{
int bar = 42;

}

Here `bar` does not exist until you call `foo()` and it disappears as soon
as the function returns.

It's the very same situation in Python:

class A(object):
def foo(self):
bar = 42

The local name `bar` only exists if `foo()` is called on an instance of `A`.

Ciao,
Marc 'BlackJack' Rintsch

Aug 10 '07 #3
On Fri, 10 Aug 2007 05:54:03 -0700, MD wrote:
On Aug 10, 12:43 am, Marc 'BlackJack' Rintsch <bj_...@gmx.netwrote:
>class A(object):
def foo(self):
bar = 42

The local name `bar` only exists if `foo()` is called on an instance of `A`.

Thanks for your reply. I am calling my extension function from the
class method itself. So at that point the variable does exist. I am
puzzled why PyModule_GetDict is not able to access the variable even
though it does exist at that point.
It does not exist in the module or the function object but on the stack.
Let's go to C again:
void baz(void);

void foo(void)
{
int bar = 42;
baz();
}

How do you get from `baz()` the value of `foo()`\s local `bar`? Other
than ugly non portable stack trickery!?

Why don't you just give the object as argument to your C function?
Wanting to poke around in the callers name space is code smell. Don't do
that.

Ciao,
Marc 'BlackJack' Rintsch
Aug 10 '07 #4

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

3 posts views Thread by csx | last post: by
27 posts views Thread by Maximus | last post: by
13 posts views Thread by Jason Huang | last post: by
2 posts views Thread by Besta | last post: by
16 posts views Thread by Bob Hairgrove | last post: by
51 posts views Thread by Tony Sinclair | last post: by
reply views Thread by XIAOLAOHU | last post: by

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.