I ran into a weird behavior with lexical scope in Python. I'm hoping
someone on this forum can explain it to me.
Here's the situation: I have an Outer class. In the Outer class, I
define a nested class 'Inner' with a simple constructor. Outer's
constructor creates an instance of Inner. The code looks like this:
=========
class Outer:
class Inner:
def __init__(self):
pass
def __init__ (self):
a = Inner()
Outer()
=========
However, the above code doesn't work. The creation of Inner() fails.
The error message looks like this:
File "/tmp/foo.py", line 12, in <module>
Outer()
File "/tmp/foo.py", line 10, in __init__
a = Inner()
NameError: global name 'Inner' is not defined
This surprises me! Since the construction of Inner takes place within
the lexical scope 'Outer', I assumed the interpreter would search the
Outer scope and find the 'Inner' symbol. But it doesn't! If I change:
a = Inner()
to
a = Outer.Inner()
it works fine, though.
So, can anyone explain to me how Python looks up symbols? It doesn't
seem to be searching the scopes I expected...
Thanks,
--Steve 9 1648
mrstevegross <mr**********@gmail.comwrites:
I ran into a weird behavior with lexical scope in Python. I'm hoping
someone on this forum can explain it to me.
Here's the situation: I have an Outer class. In the Outer class, I
define a nested class 'Inner' with a simple constructor. Outer's
constructor creates an instance of Inner. The code looks like this:
=========
class Outer:
class Inner:
def __init__(self):
pass
def __init__ (self):
a = Inner()
Outer()
=========
However, the above code doesn't work. The creation of Inner() fails.
This is because there isn't lexical scoping in class scopes.
Try replacing
a = Inner()
with
a = Outer.Inner()
Alternatively,
class Outer:
class Inner:
...
def __init__(self, Inner=Inner):
a = Inner()
HTH
--
Arnaud
def __init__(self, Inner=Inner):
Ok, the Inner=Inner trick works. What the heck does that do, anyway?
I've never seen that formulation.
--Steve
I want to write a Vector class and it makes the most sense to just subclasslist. I also want to be able to instantiate a vector using either:
Vector( 1, 2, 3 )
OR
Vector( [1, 2, 3] )
so I have this:
class Vector(list):
def __new__( cls, *a ):
try:
print a
return list.__new__(cls, a)
except:
print 'broken'
return list.__new__(cls, list(a))
doing Vector( 1, 2, 3 ) on this class results in a TypeError - which doesn't seem to get caught by the try block (ie "broken" never gets printed, and it never tries to
I can do pretty much the exact same code but inheriting from tuple instead of list and it works fine.
is this a python bug? or am I doing something wrong?
thanks,
-h.
>def __init__(self, Inner=Inner):
SteveOk, the Inner=Inner trick works. What the heck does that do, anyway?
SteveI've never seen that formulation.
Understanding that will put you on the path to scoping enlightenment.
Consider when that default assignment is established and how that might
differ from the assignment that occurs when __init__ is called.
Skip
At 2008-11-06T16:57:39Z, mrstevegross <mr**********@gmail.comwrites:
class Outer:
class Inner:
def __init__(self):
pass
def __init__ (self):
a = Inner()
Outer()
Try instead:
class Outer:
def __init__(self):
a = self.Inner()
--
Kirk Strauser
The Day Companies
On Nov 6, 9:57*pm, mrstevegross <mrstevegr...@gmail.comwrote:
I ran into a weird behavior with lexical scope in Python. I'm hoping
someone on this forum can explain it to me.
Here's the situation: I have an Outer class. In the Outer class, I
define a nested class 'Inner' with a simple constructor. Outer's
constructor creates an instance of Inner. The code looks like this:
=========
class Outer:
* class Inner:
* * def __init__(self):
* * * pass
* def __init__ (self):
* * a = Inner()
Outer()
=========
However, the above code doesn't work. The creation of Inner() fails.
The error message looks like this:
* File "/tmp/foo.py", line 12, in <module>
* * Outer()
* File "/tmp/foo.py", line 10, in __init__
* * a = Inner()
NameError: global name 'Inner' is not defined
This surprises me! Since the construction of Inner takes place within
the lexical scope 'Outer', I assumed the interpreter would search the
Outer scope and find the 'Inner' symbol. But it doesn't! If I change:
* a = Inner()
to
* a = Outer.Inner()
it works fine, though.
AFAIK, when 'Outer.__init__' executes, 'Inner' is first searched for
within 'Outer.__init__()'s local namespace. Since 'Inner' is defined
outside the function namespace, the search will fail. Python then
looks at the module level namespace - where Inner is again not defined
(only 'Outer' is available in the module namespace), the final search
will be in the interpreter global namespace which will fail too. When
you change your code from 'Inner' to 'Outer.Inner', the module level
namespace search will match ( or atleast that's how i think it should
all work :) )
Try this ..
class Outer:
def __init__(self):
class Inner:
def __init__(self): pass
a = Inner()
Outer()
This should work, because the Outer.__init__ namespace (first
namespace being searched) has Inner defined within it
-srp
>
So, can anyone explain to me how Python looks up symbols? It doesn't
seem to be searching the scopes I expected...
Thanks,
--Steve
Hamish McKenzie <ha****@valvesoftware.comwrites:
I want to write a Vector class and it makes the most sense to just
subclass list. I also want to be able to instantiate a vector using
either:
Vector( 1, 2, 3 )
OR
Vector( [1, 2, 3] )
so I have this:
class Vector(list):
def __new__( cls, *a ):
try:
print a
return list.__new__(cls, a)
except:
print 'broken'
return list.__new__(cls, list(a))
doing Vector( 1, 2, 3 ) on this class results in a TypeError - which
doesn't seem to get caught by the try block (ie "broken" never gets
printed, and it never tries to
I can do pretty much the exact same code but inheriting from tuple
instead of list and it works fine.
is this a python bug? or am I doing something wrong?
You're doing something wrong!
When you call Vector.__new__(cls, *a), this creates a new list object
(call it L) and then calls Vector.__init__(L, *a) automatically, falling
back to list.__init__(L, *a) (which won't work when a has more than one
element). In fact list initialisation is done in list.__init__, not in
list.__new__ (as opposed to tuple initialisation because tuples are
immutable).
A solution:
>>class Vector(list):
.... def __init__(self, *args):
.... try:
.... list.__init__(self, *args)
.... except TypeError:
.... list.__init__(self, args)
....
>>Vector([1,2,3])
[1, 2, 3]
>>Vector(1,2,3)
[1, 2, 3]
>>Vector(1)
[1]
>>Vector()
[]
HTH
--
Arnaud sa*********@gmail.com wrote:
On Nov 6, 9:57 pm, mrstevegross <mrstevegr...@gmail.comwrote:
>I ran into a weird behavior with lexical scope in Python. I'm hoping someone on this forum can explain it to me.
Here's the situation: I have an Outer class. In the Outer class, I define a nested class 'Inner' with a simple constructor. Outer's constructor creates an instance of Inner. The code looks like this:
========= class Outer: class Inner: def __init__(self): pass def __init__ (self): a = Inner() Outer() =========
However, the above code doesn't work. The creation of Inner() fails. The error message looks like this:
File "/tmp/foo.py", line 12, in <module> Outer() File "/tmp/foo.py", line 10, in __init__ a = Inner() NameError: global name 'Inner' is not defined
This surprises me! Since the construction of Inner takes place within the lexical scope 'Outer', I assumed the interpreter would search the Outer scope and find the 'Inner' symbol. But it doesn't! If I change: a = Inner() to a = Outer.Inner()
it works fine, though.
So do that.
AFAIK, when 'Outer.__init__' executes, 'Inner' is first searched for
within 'Outer.__init__()'s local namespace. Since 'Inner' is defined
outside the function namespace, the search will fail. Python then
looks at the module level namespace - where Inner is again not defined
(only 'Outer' is available in the module namespace), the final search
will be in the interpreter global namespace which will fail too. When
Interpreter global namespace == builtins
you change your code from 'Inner' to 'Outer.Inner', the module level
namespace search will match ( or atleast that's how i think it should
all work :) )
Correct
Try this ..
Why?
class Outer:
def __init__(self):
class Inner:
def __init__(self): pass
a = Inner()
This create a duplicate Inner class object for every instance of Outer,
which is almost certainly not what the OP wants.
Outer()
This should work, because the Outer.__init__ namespace (first
namespace being searched) has Inner defined within it
tjr
In message <ma**************************************@python.o rg>, Terry
Reedy wrote: sa*********@gmail.com wrote:
>class Outer: def __init__(self): class Inner: def __init__(self): pass a = Inner()
This create a duplicate Inner class object for every instance of Outer,
which is almost certainly not what the OP wants.
Does it matter? This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
by: Konrad Den Ende |
last post by:
Normally, one can put any bull as long as comments are on, as in:
// import yava.biteme.yo_mamma;
but when i tried to do
//String s =...
|
by: Matt Knepley |
last post by:
I must be misunderstanding how Python 2.3 handles lexical scoping.
Here is a sample piece of code:
def run():
a = 1
def run2(b):
print a...
|
by: ncf |
last post by:
Ok, I've been tring to resolve this issue for some time now (~1 day
which is way longer than normal for me) to no avail.
I am reading a file into...
|
by: jslowery |
last post by:
I am not completely knowledgable about the status of lexical scoping in
Python, but it was my understanding that this was added in a long time
ago...
|
by: Miro |
last post by:
Vb2003, im still learning vb.net but I do not understand my output from this
logic.
If someone can help me out here.
Cor Ligthert, you I believe...
|
by: enaeher |
last post by:
I would expect this code:
globalFnArray = ;
for (var i = 0; i < 5; i++) { globalFnArray.push (function () { alert
(i) }); }
for (var j = 0; j <...
|
by: thamizh.veriyan |
last post by:
Hi,
I am new to this community. I have a doubt regarding trap
representations.
I read in IBM's website that something like this is legal:
...
|
by: globalrev |
last post by:
i cant figure outif python has lexical or general scope.
it seems functions have lexical scope but with some restrictions and
some non-function...
|
by: Matt Nordhoff |
last post by:
Sebastjan Trepca wrote:
Python doesn't like when you read a variable that exists in an outer
scope, then try to assign to it in this scope.
...
|
by: Kemmylinns12 |
last post by:
Blockchain technology has emerged as a transformative force in the business world, offering unprecedented opportunities for innovation and...
|
by: antdb |
last post by:
Ⅰ. Advantage of AntDB: hyper-convergence + streaming processing engine
In the overall architecture, a new "hyper-convergence" concept was...
|
by: Matthew3360 |
last post by:
Hi there. I have been struggling to find out how to use a variable as my location in my header redirect function.
Here is my code.
...
|
by: Matthew3360 |
last post by:
Hi, I have a python app that i want to be able to get variables from a php page on my webserver. My python app is on my computer. How would I make it...
|
by: AndyPSV |
last post by:
HOW CAN I CREATE AN AI with an .executable file that would suck all files in the folder and on my computerHOW CAN I CREATE AN AI with an .executable...
|
by: Arjunsri |
last post by:
I have a Redshift database that I need to use as an import data source. I have configured the DSN connection using the server, port, database, and...
|
by: Matthew3360 |
last post by:
Hi,
I have been trying to connect to a local host using php curl. But I am finding it hard to do this. I am doing the curl get request from my web...
|
by: Oralloy |
last post by:
Hello Folks,
I am trying to hook up a CPU which I designed using SystemC to I/O pins on an FPGA.
My problem (spelled failure) is with the...
|
by: Carina712 |
last post by:
Setting background colors for Excel documents can help to improve the visual appeal of the document and make it easier to read and understand....
| |