4
class makeCode:
    def __init__(self,code):
            self.codeSegment = code.upper()
            if checkSegment(self.codeSegment):
                    quit()
            self.info=checkXNA(self.codeSegment)
    def echo(self,start=0,stop=len(self.codeSegment),search=None): #--> self not defined
            pass

Not working...

  • it says that the variable self is not defined when it actually was;
  • the function checkSegment returns 1 if the input was not a string made of nucleotids letter, or if that contains nucleotids that can't be together;
  • it quits if that happens, that's ok it works perfectly;
  • then it assigns the information (if it's RNA or DNA) checking with the function checkXNA that returns a string with the information "dnaSegment" or "rnaSegment"; works perfectly.

But then the function echo which will be designed for printing more specific information tells me that self is not defined, but why?

mrk
  • 4,999
  • 3
  • 27
  • 42
Felishia
  • 61
  • 6

2 Answers2

6

self is not defined at function definition time, you cannot use it to create a default argument.

Expressions in a function definition are evaluated when the function is created, not when it is being called, see "Least Astonishment" and the Mutable Default Argument.

Use the following technique instead:

def echo(self, start=0, stop=None, search=None):
    if stop is None:
        stop = len(self.codeSegment)

If you need to support None as a possible value for stop (e.g. None is a valid value for stop if specified explicitly), you'll need to pick a different unique sentinel to use:

_sentinel = object()

class makeCode:
    def echo(self, start=0, stop=_sentinel, search=None):
        if stop is _sentinel:
            stop = len(self.codeSegment)
Community
  • 1
  • 1
Martijn Pieters
  • 1,048,767
  • 296
  • 4,058
  • 3,343
6

A default parameter value is evaluated when the function or method definition is evaluated, i.e. when the class is parsed.

The way to write default parameter values that depend on object state is to use None as a sentinel:

def echo(self,start=0,stop=None,search=None):
    if stop is None:
        stop = len(self.codeSegment)
    pass
ecatmur
  • 152,476
  • 27
  • 293
  • 366