Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python code, self not defined

Tags:

python

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?

like image 462
Felishia Avatar asked Dec 16 '22 17:12

Felishia


2 Answers

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)
like image 90
Martijn Pieters Avatar answered Dec 21 '22 23:12

Martijn Pieters


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
like image 25
ecatmur Avatar answered Dec 22 '22 00:12

ecatmur