NameError: name 'self' is not defined, even though it is?

67,582

The for loop is indented incorrectly resulting in it being outside that method's scope but inside the class' scope. This in turn means that self is not defined.

Python does interpret that loop code in the scope of the class, but without an instance of the object. Sample malformed code:

class Simple(object):
    def __init__(self, a):
        self.a = a

    print("Here we go!")
    for i in xrange(self.a):
        print(i)

Traceback

$ python simple.py
Here we go!
Traceback (most recent call last):
  File "simple.py", line 4, in <module>
    class Simple(object):
  File "simple.py", line 9, in Simple
    for i in xrange(self.a):
NameError: name 'self' is not defined
Share:
67,582
Paul Bentham
Author by

Paul Bentham

Updated on June 17, 2020

Comments

  • Paul Bentham
    Paul Bentham almost 4 years

    Can anyone helps me understand why this is this giving me an error? The error being "NameError: name 'self' is not defined". I have a similar class higher up in my code and that works fine?

    I'm using 'xlrd' and team is a reference to a workbook.sheet_by_name.

    class Rollout:                                  
        def __init__(self, team, name):
            self.team = team
            self.name = name
            self.jobs = {}
            self.start_row = 1
            self.last_row = self.team.nrows
    
        for i in range(self.start_row,self.last_row):
                try:
                    self.jobs[i-1] =   [str(self.team.cell_value(i,0)).upper(), \
                                        str(self.team.cell_value(i,1)).upper(), \
                                        str(self.team.cell_value(i,2)).upper(), \
                                        str(self.team.cell_value(i,3)).upper(), \
                                        str(xlrd.xldate_as_tuple(self.team.cell_value(i,4),0)[3]), \
                                        str(self.team.cell_value(i,5)).upper(), \
                                        str(self.team.cell_value(i,6)).upper()]
                except ValueError:
                    print "It look's like one of your 'time' cells is incorrect!"
                    self.jobs[i-1] =   [str(self.team.cell_value(i,0)).upper(), \
                                        str(self.team.cell_value(i,1)).upper(), \
                                        str(self.team.cell_value(i,2)).upper(), \
                                        str(self.team.cell_value(i,3)).upper(), \
                                        "missing", \
                                        str(self.team.cell_value(i,5)).upper(), \
                                        str(self.team.cell_value(i,6)).upper()]
    
  • Silas Ray
    Silas Ray over 10 years
    Python interprets the loop code in the execution scope of the class body. Whatever ends up in the namespace after executing the code in the class scope becomes the attribute dictionary of the class object. Were there not a NameError because of self, Simple.i would end up being whatever i ended up set to after the loop completed.
  • mishsx
    mishsx almost 4 years
    This does not answer the OP's question. You're explaining him what a class is which is not what has been asked. Please remove/ edit your answer accordingly
  • Dominux
    Dominux over 3 years
    Man, it is another problem, and a difference between difficulty of yours one and presented one is like between the sky and the Earth