TypeError: object.__init__() принимает ровно один аргумент (экземпляр для инициализации) для моего лексера

#python #python-3.x

#python #python-3.x

Вопрос:

Здравствуйте, я пытаюсь создать лексер для своего языка программирования под названием AJPS, и я борюсь с этим, потому что я отстой с python stacktraces, так что может кто-нибудь, пожалуйста, помогите, спасибо, это также будет язык моей мечты, потому что я продолжаю переключаться с языка на язык, например, как я делал haskell некоторое время, а затем я сделалним затем я сделал f # затем я сделал c затем я сделал c затем я сделал c # (я НЕНАВИДЕЛ ЭТО) затем я перешел на python затем решил сделать это

ajps.py

 DIGITS = '0123456789'

#########################################
#                ERRORS                 #
#########################################
class err:
    def __init__(self, errn, details):
        self.errn = errn
        self.details = details

    def as_string(self):
        result = f'{self.errn}: {self.details}'
        return result

class unExChar:
    def __init__(self, details):
        super().__init__('AJPS DOES NOT UNDERSTAND CHAR AT', details)
#########################################
#                TOKENS                 #
#########################################
AJPS_INT = 'INT'
AJSP_FLOAT = 'FLOAT'
AJSP_PLUS = 'PLUS'
AJSP_MINUS = 'MINUS'
AJSP_MUL = 'MUL'
AJSP_DIV = 'DIV'
AJSP_LPAREN = 'LPAREN'
AJPS_RPAREN = 'RPAREN'
class Token: 
    def __init__(self, type_, value=None):
        self.type = type_
        self.value = value
    def __repr__(self):
        if self.value: return f'{self.type}:{self.value}'
        return f'{self.type}'
#########################################
#             LEXING CLASS              #
#########################################
class Lex:
    def __init__(self, text):
        self.text = text
        self.pos = -1
        self.cchar = None
        self.advance()

    def advance(self):
        self.pos  = 1
        self.cchar = self.text[self.pos] if self.pos < len(self.text) else None
    def mtok(self):
        tokens = []
        while self.cchar != None:
            if self.cchar in 't':
                self.advance()
            elif self.cchar in DIGITS:
                tokens.append(self.make_number())
            elif self.cchar == 'ps':
                tokens.append(Token(AJSP_PLUS))
                self.advance()
            elif self.cchar == 'ms':
                tokens.append(Token(AJSP_MINUS))
                self.advance()
            elif self.cchar == 'my':
                tokens.append(Token(AJSP_MUL))
                self.advance()
            elif self.cchar == 'de':
                tokens.append(Token(AJSP_DIV))
                self.advance()
            elif self.cchar == 'bp':
                tokens.append(Token(AJSP_LPAREN))
                self.advance()
            elif self.cchar == 'ep':
                tokens.append(Token(AJPS_RPAREN))
                self.advance()
            else:
                char = self.cchar
                self.advance()
                return [], unExChar("'"   char   "'")
        return tokens, None
    
    def make_number(self):
        numstr = ''
        dotc = 0
        while self.cchar != None and self.cchar in DIGITS   '.':
            if self.cchar == '.':
                if dotc == 1: break
                dotc  = 1
                numstr  = '.'
            else:
                numstr  = self.cchar
            self.advance()
        
        if dotc == 0:
            return Token(AJPS_INT, int(numstr))
        else:
            return Token(AJPS_FLOAT, float(numstr))

#########################################
#                  RUN                  #
#########################################
def run(text):
    lexer = Lex(text)
    toks, err_ = lexer.mtok()
    return toks, err_
  

Моя трассировка стека

 ajsp:> 1 ps 2
Traceback (most recent call last):
  File "shell.py", line 4, in <module>
    result, error = ajsp.run(text)
  File "C:UserssudoDesktopajspajsp.py", line 102, in run
    toks, err_ = lexer.mtok()
  File "C:UserssudoDesktopajspajsp.py", line 77, in mtok
    return [], unExChar("'"   char   "'")
  File "C:UserssudoDesktopajspajsp.py", line 17, in __init__
    super().__init__('AJPS DOES NOT UNDERSTAND CHAR AT', details)
TypeError: object.__init__() takes exactly one argument (the instance to initialize)
  

Комментарии:

1. Вы имели в виду наследовать err от unExChar ? class unExChar(err)

2. Спасибо, я немного глупый lmfao

3. Джеймс уже решил вашу проблему, но помните, что имена ваших классов должны начинаться с заглавных букв.

Ответ №1:

Вы вызываете super() свой unExChar класс, который не является подклассом другого класса, который вы определили. Это означает super , что по умолчанию object будет использоваться базовый класс, подклассом которого является everything , но который принимает только один аргумент.

Я думаю, вы просто забыли подкласс err , попробуйте:

 class unExChar(err):
    def __init__(self, details):
        super().__init__('AJPS DOES NOT UNDERSTAND CHAR AT', details)
  

Комментарии:

1. Это подкласс object , и object.__init__ не принимает никаких дополнительных аргументов.

2. @chepner, это было то, что я пытался передать. думаю, не слишком хорошо. Я уточню.