Newbie NameError problem

M

MartinRinehart

I don't understand what I don't understand in the following:
------------------------------------------
# reader.py - testing char-by-char marching methods

f = open('sample_decaf.d', 'r')
text = f.readlines()
f.close()

# this is C-style, 15 lines, in Python:
end_line = len(text)
line_ptr = 0

while line_ptr < end_line:

input = text[line_ptr]
output = ''
char_ptr = 0
end_char = len(input)

while char_ptr < end_char:
output += input[char_ptr]
char_ptr += 1

print output,
line_ptr += 1

# this is Python, 7 lines:

for line in text:
output = ''

for char in line:
output += char

print output,

# but I need locations, so this is impure, 11-line, Python:

line_ptr = 0
for line in text:
output = ''
char_ptr = 0

for char in line:
output += char
char_ptr += 1

print output,
line_ptr += 1

# with a Loc object, 10 lines (not counting the Loc class):

loc = Loc(0,0) # Name error: name 'Loc' is not defined
for line in text:
output = ''

for char in line:
output += char
loc.nextChar()

print output + Loc.repr(),
loc.nextLine()

class Loc:
line = 0
char = 0

def __init__(self, l, c):
line = l
char = c

def nextChar(self):
char += 1

def nextLine(self):
line += 1
char = 0

def repr(self):
return 'Loc: line='+str(line)+', char='+str(char)

# end of class Loc

# end of reader.py
 
C

Calvin Spealman

I don't understand what I don't understand in the following:

You also don't understand how to ask for help properly. Your example
is too large, for one. You want a "minimal working example" (http://
ironfroggy-code.blogspot.com/2007/02/minimal-working-examples-how-to-
why-and.html) where working means it works to demonstrate the problem
you are having. You need to actually show us what is breaking, which
means the traceback that gives you the NameError.

As for the problem itself, I am not going to look through all that
code or run it myself. That is why you want minimal examples and to
include the errors for us to read. But, if you don't know, a
NameError means you tried to use a variable before assigning to it,
so look for that. It could also be as simple as misspelling something.
 
P

Paul Rudin

I don't understand what I don't understand in the following:

I haven't tried to understand what your code is doing - but the
NameError arises because you try to use Loc before its definition. Put
the definition first and the error should go away.
 
C

cokofreedom

I haven't tried to understand what your code is doing - but the
NameError arises because you try to use Loc before its definition. Put
the definition first and the error should go away.

Class Loc must be placed ABOVE the code that uses it.
 
B

Bruno Desthuilliers

(e-mail address removed) a écrit :
I don't understand what I don't understand in the following:

You already have the answer (hint: a Python module is sequentially
executed when loaded by the interpreter)

Just a couple side notes:
> # but I need locations, so this is impure, 11-line, Python:

line_ptr = 0
for line in text:
output = ''
char_ptr = 0

for char in line:
output += char
char_ptr += 1

print output,
line_ptr += 1


Use enumerate and a for loop.

for line_ptr, line in enumerate(text):
for char_ptr, char in enumerate(line):
print "char %s of line %s is %s" % (char_ptr, line_ptr, char)
# with a Loc object, 10 lines (not counting the Loc class):

loc = Loc(0,0) # Name error: name 'Loc' is not defined

Indeed. It is not yet defined at this time. Remember that in Python,
almost everything happens at runtime.


(snip)

I think you're going to have a hard time if you don't read about
Python's object model...
class Loc:

Better to use new-style classes unless you have compelling reasons to
stick with the very outdated 'classic' model.

class Loc(object):
line = 0
char = 0

This define two class attributes - that is, attributes that are members
of the Loc class object (*not* Loc instances), and so are shared by all
instances. This is probably not what you want.
def __init__(self, l, c):
line = l
char = c

This defines two local variables line and char, bind them to resp. l and
c, then returns - discarding locals of course.

The use of 'self' is *not* optional in Python. Within the function, it's
a reference to the current instance. If you want to define instance
attributes, you have to set these attributes on the current instance.

def __init__(self, line, char):
self.line = line
self.char = char
def nextChar(self):
char += 1

NameError here. You want self.char
def nextLine(self):
line += 1

NameError here. You want self.line

Local variable, discarded when exiting the function. You want self.char
def repr(self):
return 'Loc: line='+str(line)+', char='+str(char)

NameError * 2, etc...

Also, Python has string formatting:

def __repr__(self):
return "<Loc: line=%s - char=%s>" % (self.line, self.char)

HTH
 
S

Sion Arrowsmith

I don't understand what I don't understand in the following:
[ ... ]

You've already got an answer as to what's causing your name error.
But that's not your only problem. It looks like you need an
introduction to enumerate():

for line_ptr, text in enumerate(file('sample_decaf.d')):
for char_ptr, char in enumerate(text):
# whatever you want to do with your chacter-by-character
# processing with line and charater positions
 
M

MartinRinehart

Thanks to all!

I will put my class defs first (tho not without expressing my
disappointment that this is required in a late 20th century language);
learn about enumerate as it looks like exactly what I need and discard
my C++/Java based object model because this is a totally other thing.

If someone who knows both object models would comment on Python's
model v. C++/Java's model that would be helpful.
 
C

Carsten Haese

Thanks to all!

I will put my class defs first (tho not without expressing my
disappointment that this is required in a late 20th century language);

You don't have to physically *put* class definitions first in your code.
What matters is that they get *executed* first. They following will work
just fine:

#######################
def main():
x = SomeClass()
x.DoSomething()

class SomeClass:
...

main()
#######################

Expecting to use a class before it's defined is equivalent to expecting
this to work:

########################
print a
a = "Hello World"
########################

Even here in the early 21st century, we don't have clairvoyant computers
yet.
 
B

Bruno Desthuilliers

(e-mail address removed) a écrit :
Thanks to all!

I will put my class defs first (tho not without expressing my
disappointment that this is required in a late 20th century language);

That's because you dont get the "execution model" of Python.

First point, remember that Python in Python everything is an object -
including classes and functions.

Now a Python module is a list of statements, and all these statements (I
mean, the ones at the top-level of the module) are executed sequentially
when the module is loaded. The def and class statements actually
*define* corresponding names in the defining namespace - and of course
bind the newly created function or class objects to these names. So you
can see def and class statements as name-binding (IOW: assignement)
operations.

So indeed, until the def or class statement has been fully executed, the
corresponding object doesn't exist, and can't obviously be bound to a
name.

Would you expect the following code to work ?

# dumb.py
print foo
foo = 42

If you understand that the class statement is to be read as a convenient
shortcut for an operation that otherwise looks like:

ClassName = some_call_that_creates_a_class_object(all_required_params)

you understand why you cannot expect to use class ClassName before this
statement has been executed.

Now this is seldom a problem since - except perhaps for trivial scripts
- one usually put the effective code in functions. Python is not a
"better bash" - it's really a full-blown application programming
language that *also* happen to be usable for scripting.
learn about enumerate as it looks like exactly what I need and discard
my C++/Java based object model because this is a totally other thing.

If someone who knows both object models would comment on Python's
model v. C++/Java's model that would be helpful.

There have been a couple posts here about Python's object model recently
IIRC. But anyway, starting with the online tutorial, then reading the
doc section about new-style classes should be a good start. If you have
questions then, please post here.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,763
Messages
2,569,562
Members
45,038
Latest member
OrderProperKetocapsules

Latest Threads

Top