On Dec 23, 5:58 pm, "BJörn Lindqvist" <[EMAIL PROTECTED]> wrote:
> On 23 Dec 2006 14:38:19 -0800, Adam Atlas <[EMAIL PROTECTED]> wrote:
>
> > Is it possible for an object, in its __init__ method, to find out if it
> > is being assigned to a variable, and if so, what that variable's name
> > is? I can think of some potentially ugly ways of finding out using
> > sys._getframe, but if possible I'd prefer something less exotic.
> > (Basically I have a class whose instances, upon being created, need a
> > 'name' property, and if it's being assigned to a variable immediately,
> > that variable's name would be the best value of 'name'; to make the
> > code cleaner and less redundant, it would be best if it knew its own
> > name upon creation, just like functions and classes do, without the
> > code having to pass it its own name as a string.)I guess you mean something 
> > like this:
>
> >>> olle = Person()
> >>> olle.name"olle"
>
> Instead of:
>
> >>> olle = Person("olle")
> >>> olle.name"olle"
>
> It is not possible without ugly hacks. What you could use instead is
> some kind of registry approach:
>
> reg = {}
> class Person:
>     def __init__(self, name):
>         self.name = name
>         reg[name] = self
>
> >>> Person("olle")
> >>> reg["olle"].name"olle"
>
> I think there are thousand different ways you could solve it.

Yeah, I've thought of ways like that. I was just hoping to make the
syntax as minimal and Pythonic as possible.

I have the following working:

> import sys
>
> class c:
>     def __init__(self):
>         f = sys._getframe(1)
>         names = [n for n in f.f_code.co_names if n not in f.f_locals]
>         if len(names) > 0:
>             name = names[0]
>             print name
>
> a = c() # prints 'a'
> b = 'blah'
> b = c() # prints nothing

Question: too evil?

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

Reply via email to