Hello,
Is there a way I can, for debugging, access the instance variable name from
within a class?
E.g:
Class X:
def debug(self):
print "My instance var is %s" % (some magic Python stuff)
So that:
>>>x = X() x.debug() My Instance var is x
( Without passing the name in like: x=X(name="x") )
Thx.
\d 16 1342
Donn Ingle a écrit :
Hello,
Is there a way I can, for debugging, access the instance variable name from
within a class?
E.g:
Class X:
def debug(self):
print "My instance var is %s" % (some magic Python stuff)
So that:
>>>x = X() x.debug() My Instance var is x
( Without passing the name in like: x=X(name="x") )
What should be the "variable name" in the following situations ?
a = b = c = X()
X().debug()
On Oct 28, 6:01 am, Donn Ingle <donn.in...@gmail.comwrote:
Hello,
Is there a way I can, for debugging, access the instance variable name from
within a class?
E.g:
Class X:
def debug(self):
print "My instance var is %s" % (some magic Python stuff)
So that:
>>x = X() x.debug() My Instance var is x
( Without passing the name in like: x=X(name="x") )
You could search the global and local namespaces of the caller for a
symbol that's bound to the same object as self. For instance, to find
a such a symbol in the caller's global namespace, this might work:
def debug(self):
for sym,value in sys._getframe(1).f_globals:
if value is self:
print "My instance var is %s" % sym
Improving the example left as an exercise. There's probably quite a
few recipes to do stuff like this in the Python Cookbook (quod
googla).
Also, note that some objects are not bound to any symbols but instead
are referenced by lists or other containers.
Carl Banks
Hrvoje Niksic a écrit :
Donn Ingle <do********@gmail.comwrites:
>Is there a way I can, for debugging, access the instance variable name from within a class? E.g: Class X: def debug(self): print "My instance var is %s" % (some magic Python stuff)
As others have answered, an instance can live in many variables,
"be bound to many names" would be more accurate IMHO. Python's
"variables" are name=>object bindings.
Bruno Desthuilliers <br********************@wtf.websiteburo.oops.com >
writes:
>As others have answered, an instance can live in many variables,
"be bound to many names" would be more accurate IMHO.
Technically more accurate maybe (but see below), but I was responding
to a beginner's post, so I was striving for ease of understanding.
Python's "variables" are name=>object bindings.
No reason to use quotes. Variable is just as acceptable a term, one
used by Python itself, as witnessed by the "vars" builtin, but also in
PEP 8, in the language reference, and elsewhere in the docs. Even the
quite technical language reference uses both terms, such as in this
paragraph under "Naming and binding":
If a name is bound in a block, it is a local variable of that
block. If a name is bound at the module level, it is a global
variable. (The variables of the module code block are local and
global.) If a variable is used in a code block but not defined
there, it is a free variable.
I disagree with the idea that the terms "name" and "binding" are the
only correct terminology. Python is not the first language to offer
pass-by-object-reference assignment semantics. It shares it with
Lisp, Java, and many others, none of which have problems with the term
"variable".
On Oct 29, 12:46 pm, "Martin Marcher" <mar...@marcher.namewrote:
2007/10/29, Hrvoje Niksic <hnik...@xemacs.org>:
Sbe unpx inyhr, urer vf n cbffvoyr vzcyrzragngvba:
...
was that on purpose?
martin
--http://noneisyours.marcher.namehttp://feeds.feedburner.com/NoneIsYours
for humans:
For hack value, here is a possible implementation:
import inspect
def _find(frame, obj):
for name, value in frame.f_locals.iteritems():
if value is obj:
return name
for name, value in frame.f_globals.iteritems():
if value is obj:
return name
raise KeyError("Object not found in frame globals or locals")
class X:
def debug(self):
print ("Caller stores me in %s (among other possible places)"
% _find(inspect.currentframe(1), self))
>>xyzzy = X() xyzzy.debug()
Caller stores me in xyzzy (among other possible places)
>>a = b = X() a.debug()
Caller stores me in a (among other possible places)
>>b.debug()
Caller stores me in a (among other possible places)
>>X().debug()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in debug
File "<stdin>", line 8, in _find
KeyError: 'Object not found in frame globals or locals'
Hrvoje Niksic a écrit :
Bruno Desthuilliers <br********************@wtf.websiteburo.oops.com >
writes:
>>As others have answered, an instance can live in many variables,
"be bound to many names" would be more accurate IMHO.
Technically more accurate maybe (but see below), but I was responding
to a beginner's post, so I was striving for ease of understanding.
The problem is that your formulation implies (to me at least) that the
variable is actually a kind of container for the object. And I'm not
sure being inaccurate really helps (OTHO, I often tend to get too
technical, so who knows which approach is the best here... At least, the
OP will now have both !-)
>Python's "variables" are name=>object bindings.
No reason to use quotes.
Yes, there's one : to mark the difference between Python-like
name=>object bindings and C-like labels-on-memory-address variables -
the latter model being the most commonly known to beginners.
Variable is just as acceptable a term,
Indeed - no need to refer to chapter and verse here, I've read the book
too !-)
(snip)
I disagree with the idea that the terms "name" and "binding" are the
only correct terminology.
Which is not what I meant here.
Bruno Desthuilliers <br********************@wtf.websiteburo.oops.com >
writes:
The problem is that your formulation implies (to me at least) that the
variable is actually a kind of container for the object.
I really didn't expect it to be read that way, especially since the
sentence claims that the same instance can reside in several
variables. If the term variable implied containment, that would not
be possible because different variables would imply different objects.
To be fair, the OP probably *did* confuse variables with containment,
and I rot13'ed my hack to avoid unnecessarily prolonging that
confusion. However, I don't think his confusion is a consequence of
inaccurate terminology, but of an inaccurate mental model of Python
objects. When the mental model is correct, the term "variable" works
as well as any other; when it's incorrect, using different words for
the same thing is of little help.
>>Python's "variables" are name=>object bindings.
No reason to use quotes.
Yes, there's one : to mark the difference between Python-like
name=>object bindings and C-like labels-on-memory-address variables
the latter model being the most commonly known to beginners.
Are you sure about the last part? It seems to me that in recent times
more Python beginners come from a Java background than from a C one.
In any case, "variable" is a sufficiently general concept not to be
tied to a specific implementation. That the concept of variable
differs among programming languages is for me not reason enough to
eschew it.
Hrvoje Niksic a écrit :
Bruno Desthuilliers <br********************@wtf.websiteburo.oops.com >
writes:
>The problem is that your formulation implies (to me at least) that the variable is actually a kind of container for the object.
I really didn't expect it to be read that way, especially since the
sentence claims that the same instance can reside in several
variables. If the term variable implied containment, that would not
be possible because different variables would imply different objects.
To be fair, the OP probably *did* confuse variables with containment,
and I rot13'ed my hack to avoid unnecessarily prolonging that
confusion. However, I don't think his confusion is a consequence of
inaccurate terminology, but of an inaccurate mental model of Python
objects.
I'd think it has more to do with an inaccurate mental model of Python's
variables - hence my (perhaps useless) corrections.
When the mental model is correct, the term "variable" works
as well as any other; when it's incorrect, using different words for
the same thing is of little help.
This is where our POV differ. IMHO, wording and mental model have a
strong relationship - IOW, incorrect wording leads to incorrect
representation.
>>>Python's "variables" are name=>object bindings. No reason to use quotes.
Yes, there's one : to mark the difference between Python-like name=>object bindings and C-like labels-on-memory-address variables the latter model being the most commonly known to beginners.
Are you sure about the last part?
Ok, I would not bet my hand on it !-) But the (non appliable) "pass by
value"/"pass by reference" question is still asked often enough here to
be an indication.
It seems to me that in recent times
more Python beginners come from a Java background than from a C one.
Java does have "container" variables for primitive types, and even for
"references", Java's variables are more than names - they do hold type
informations too. Now I don't pretend to know how this is really
implemented, but AFAICT, and at least from a cognitive POV, Java's
variables model looks very close to the C/C++ model.
FWIW, I came to Python with a VB/C/Java/Pascal background, and Python
was the first language for which I needed to revise my mental model of
the "variable" concept.
In any case, "variable" is a sufficiently general concept not to be
tied to a specific implementation.
I'd say it's like the "type" concept : it's a general concept, but it's
not totally implementation-independant. "Type" doesn't mean exactly the
same thing in static or dynamic languages...
That the concept of variable
differs among programming languages is for me not reason enough to
eschew it.
I didn't mean to imply "variable" was an inappropriate term - just that
it may have a somewhat different meaning wrt/ some others more
mainstream languages. My humble experience is that rewording the whole
concept in terms of name=>object bindings did sometime help in the past.
for humans:
Sweet. Thanks, I'll give it a go. It's only for debugging and will make life
easier.
\d
vzcbeg vafcrpg
>
qrs _svaq(senzr, bow):
sbe anzr, inyhr va senzr.s_ybpnyf.vgrevgrzf():
vs inyhr vf bow:
erghea anzr
sbe anzr, inyhr va senzr.s_tybonyf.vgrevgrzf():
vs inyhr vf bow:
erghea anzr
envfr XrlReebe("Bowrpg abg sbhaq va senzr tybonyf be ybpnyf")
pynff K:
qrs qroht(frys):
cevag ("Pnyyre fgberf zr va %f (nzbat bgure cbffvoyr cynprf)"
% _svaq(vafcrpg.pheeragsenzr(1), frys))
Now that's taking i18n too far. Klingon is not a widely understood
language :D
\d
While Java's variable declarations bear a superficial (syntactical)
similarity to C, their semantics is in fact equivalent to the
object-reference semantics we know in Python.
I come from Z80A/GWBASIC/VB and a little C, I would describe a Python
variable as a pointer - in that it contains the address of something.
What that "something" is, is a little fuzzy. Right now I imagine it's to a
kind of structure which has meta info about the object as well as it's
actual address.
How far off would that be?
\d
En Tue, 30 Oct 2007 02:51:39 -0300, Donn Ingle <do********@gmail.com>
escribió:
>While Java's variable declarations bear a superficial (syntactical) similarity to C, their semantics is in fact equivalent to the object-reference semantics we know in Python.
I come from Z80A/GWBASIC/VB and a little C, I would describe a Python
variable as a pointer - in that it contains the address of something.
What that "something" is, is a little fuzzy. Right now I imagine it's to
a
kind of structure which has meta info about the object as well as it's
actual address.
How far off would that be?
Almost true. A Python variable is a name inside a namespace, pointing to a
Python object. Many names may point to the same object, of course.
An object (in CPython) is a structure containing a reference count,
followed by a pointer to the object's type, followed by the object
contents itself. The object contents may as simple as a single value (e.g.
int or float objects) or rather complex (like the frame object which
contains about 18 other values, including many pointers to other
structures and arrays).
The object's type would be what you call the meta info, and contains the
type name, many pointers to functions (implementing the type methods) and
some flags describing the type behavior.
--
Gabriel Genellina
Donn Ingle a écrit :
>>vzcbeg vafcrpg
qrs _svaq(senzr, bow): sbe anzr, inyhr va senzr.s_ybpnyf.vgrevgrzf(): vs inyhr vf bow: erghea anzr sbe anzr, inyhr va senzr.s_tybonyf.vgrevgrzf(): vs inyhr vf bow: erghea anzr envfr XrlReebe("Bowrpg abg sbhaq va senzr tybonyf be ybpnyf")
pynff K: qrs qroht(frys): cevag ("Pnyyre fgberf zr va %f (nzbat bgure cbffvoyr cynprf)" % _svaq(vafcrpg.pheeragsenzr(1), frys))
Now that's taking i18n too far. Klingon is not a widely understood
language :D
s/i18n/rot13/ !-)
Hrvoje Niksic a écrit :
Bruno Desthuilliers <br********************@wtf.websiteburo.oops.com >
writes:
>>>While Java's variable declarations bear a superficial (syntactical) similarity to C, their semantics is in fact equivalent to the object-reference semantics we know in Python. They implicitly refer to objects allocated on the heap and, just like in Python, the same object can be referenced by multiple variables.
You're talking about reference types here - not primitive types. And even then, from what I remember (not having done any Java these last 4 years at least), Java's reference types are much closer to C++ references than to Python.
Feel free to look it up; I believe you will find the semantics of
assignment, parameter-passing, etc., exactly the same as in Python.
I'll do - while perhaps not in a near future !-) - and keep you informed.
On Oct 28, 6:01 am, Donn Ingle <donn.in...@gmail.comwrote:
Is there a way I can, for debugging, access the instance variable name from
within a class?
Shouldn't this be in a FAQ somewhere? It's the second time (at least!)
it comes up this week.
George This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
by: Bryan Parkoff |
last post by:
I find an interesting issue that one base class has only one copy for
each derived class. It looks like that one base class will be copied into
three base classes while derived class from base...
|
by: modemer |
last post by:
Question is as in subject.
For example:
class BaseClass {
public:
void func() { do something; } // I don't want this function being
overloaded in its inherited class
};
|
by: Alfonso Morra |
last post by:
if I have a class template declared as ff:
(BTW is this a partial specialization? - I think it is)
template <typename T1, myenum_1 e1=OK, my_enum_2=NONE>
class A {
public:
A();
virtual...
|
by: Jon Slaughter |
last post by:
I have a class that is basicaly duplicated throughout several files with
only members names changing according to the class name yet with virtually
the exact same coding going on.
e.g.
class...
|
by: Sebastian Hiller |
last post by:
Hello,
i'm new to .Net (i'm using VB as language and i'm working in the
code-behind mode) and i can't solve the following problem:
I have a WebForm and want to Add a UserControl...
|
by: rodchar |
last post by:
Hey all,
I'm trying to understand Master/Detail concepts in VB.NET. If I do a data
adapter fill for both customer and orders from Northwind where should that
dataset live?
What client is...
|
by: Chris Puncher |
last post by:
Hi.
I have a RCW class that was generated by the VS.NET2003 IDE when I added a
COM dll reference to my project. This all works fine when I call methods on
it. My initial problem is that in...
|
by: needin4mation |
last post by:
I have a .aspx file and it's src. I also have a third file, a class
that the src references. Everything is in the same directory/folder.
Everything has the same namespace. How do I reference the...
|
by: Tony |
last post by:
I'm working with GUI messaging and note that MFC encapsulates
the message loop inside of a C++ class member function. Is this
somehow inherently less robust than calling the message loop
functions...
|
by: K Viltersten |
last post by:
Suppose there is the following class structure.
class S {...}
class A : S {...}
class B : S {...}
class A1 : A {void m(){...}}
class B1 : B {void m(){...}}
class B2 : B {...}
Just to clarify...
|
by: isladogs |
last post by:
The next Access Europe meeting will be on Wednesday 7 Feb 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:30 (7.30PM).
In this month's session, the creator of the excellent VBE...
|
by: MeoLessi9 |
last post by:
I have VirtualBox installed on Windows 11 and now I would like to install Kali on a virtual machine. However, on the official website, I see two options: "Installer images" and "Virtual machines"....
|
by: DolphinDB |
last post by:
The formulas of 101 quantitative trading alphas used by WorldQuant were presented in the paper 101 Formulaic Alphas. However, some formulas are complex, leading to challenges in calculation.
Take...
|
by: Aftab Ahmad |
last post by:
So, I have written a code for a cmd called "Send WhatsApp Message" to open and send WhatsApp messaage. The code is given below.
Dim IE As Object
Set IE =...
|
by: isladogs |
last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM).
In this month's session, we are pleased to welcome back...
|
by: Vimpel783 |
last post by:
Hello!
Guys, I found this code on the Internet, but I need to modify it a little. It works well, the problem is this: Data is sent from only one cell, in this case B5, but it is necessary that data...
|
by: jfyes |
last post by:
As a hardware engineer, after seeing that CEIWEI recently released a new tool for Modbus RTU Over TCP/UDP filtering and monitoring, I actively went to its official website to take a look. It turned...
|
by: ArrayDB |
last post by:
The error message I've encountered is; ERROR:root:Error generating model response: exception: access violation writing 0x0000000000005140, which seems to be indicative of an access violation...
|
by: PapaRatzi |
last post by:
Hello,
I am teaching myself MS Access forms design and Visual Basic. I've created a table to capture a list of Top 30 singles and forms to capture new entries. The final step is a form (unbound)...
| |