Python ';pos#u start';在我不知道的东西的海洋中没有定义';我不太明白

Python ';pos#u start';在我不知道的东西的海洋中没有定义';我不太明白,python,Python,所以,我正致力于将编程语言作为一个有趣的项目,所以我决定学习本教程。当我看完第一集时,它说了这个错误: Name_Error: name 'pos_start' is not defined 这是代码(对不起,很长) ########### #常数# ########### DIGITS=“123456789” ######## #错误# ######## 类错误: 定义初始(自我、位置开始、位置结束、错误名称、详细信息): self.pos\u start=pos\u start self.

所以,我正致力于将编程语言作为一个有趣的项目,所以我决定学习本教程。当我看完第一集时,它说了这个错误:

Name_Error: name 'pos_start' is not defined
这是代码(对不起,很长)

###########
#常数#
###########
DIGITS=“123456789”
########
#错误#
########
类错误:
定义初始(自我、位置开始、位置结束、错误名称、详细信息):
self.pos\u start=pos\u start
self.pos\u end=pos\u end
self.error\u name=error\u name
self.details=详细信息
def as_字符串(自身):
结果=f'{self.error_name}:{self.details}'
结果+=f'File{self.pos_star.fn},第{self.pos_start.ln+1}行
返回结果
类IllegalCharError(错误):
定义初始(自我、位置开始、位置结束、详细信息):
超级()
##########
#位置#
##########
班级职务:
定义初始化(self、idx、ln、col、fn、ftxt):
self.idx=idx
self.ln=ln
self.col=col
self.fn=fn
self.ftxt=ftxt
def前进(自身、当前字符):
self.idx+=1
self.col+=1
如果当前字符=“\n”:
self.ln+=1
self.col=0
回归自我
def副本(自我):
返回位置(self.idx、self.ln、self.col、self.fn、self.ftxt)
########
#代币#
########
TT_INT=“TT_INT”
TT_FLOAT=“FLOAT”
TT_PLUS=“PLUS”
TT_减号=“减号”
TT_MUL=“MUL”
TT_DIV=“DIV”
TT_LPAREN=“LPAREN”
TT_RPAREN=“RPAREN”
类令牌:
定义初始化(self,type,value=None):
self.type=type_
自我价值=价值
定义报告(自我):
if self.value:返回f'{self.type}:{self.value}'
返回f'{self.type}'
#######
#雷克瑟#
#######
类Lexer:
定义初始化(self,fn,text):
self.fn=fn
self.text=文本
self.pos=位置(-1,0,-1,fn,文本)
self.current_char=None
self.advance()
def预付款(自助):
自身位置预付款(自身当前字符)
self.current_char=self.text[self.pos.idx]如果self.pos.idx
请注意,我在python方面很差劲,所以除了一点类之外,我不了解其中的大部分内容,因为我正在学习教程。 那么,比我聪明的人能帮我找到错误吗?谢谢。
编辑:已关闭!我在tutorial maker的github页面上发现了此错误。

是否有堆栈跟踪与该错误消息一起出现?如果有,则应该告诉您问题所在

在您的代码中搜索有问题的符号,我发现只有一个地方可以找到该符号。那就是这一行:

return [], IllegalCharError(pos_start, self.pos, "'" + char +"'")
make_tokens
方法中。我看不到任何地方正在定义该符号,使其在代码中的该点具有值。对该符号的所有其他引用都具有匹配的定义,即在尝试该引用之前应定义该符号

def make_tokens(self):
    tokens = []
    while self.current_char != None:
      if self.current_char in ' \t':
        self.advance()
      elif self.current_char in DIGITS:
        tokens.append(self.make_number())
      elif self.current_char == "+":
        tokens.append(Token(TT_PLUS))
        self.advance()
      elif self.current_char == "-":
        tokens.append(Token(TT_MINUS))
        self.advance()
      elif self.current_char == "*":
        tokens.append(Token(TT_MUL))
        self.advance()
      elif self.current_char == "/":
        tokens.append(Token(TT_DIV))
        self.advance()
      elif self.current_char == "(":
        tokens.append(Token(TT_LPAREN))
        self.advance()
      elif self.current_char == ")":
        tokens.append(Token(TT_RPAREN))
        self.advance()
      else:
        self.pos.copy()
        char = self.current_char
        self.advance()
        return [], IllegalCharError(pos_start, self.pos, "'" + char +"'")

我相信这是因为你在这里调用了
pos\u start
,而没有使用
self
。请告诉我这是否解决了问题。使用
self.pos\u start
,这就是定义。

您好,欢迎使用StackOverflow!您介意编辑您的帖子并向我们展示完整的回溯吗?您的意思是说,完整的错误?
pos\u start
是一个member的
错误
不是
Lexer
,即使您在正确的类中引用了它,您仍然需要使用
self.pos\u start
。我想到这一点是因为我想能够告诉OP他可能要做什么来修复问题。我不认为
self.pos\u start
在代码中的这一点上被定义。该代码位于
Lexer
类中的一个方法中。如果您查看该类的
\uuuu init\uuuu
方法,您将不会看到设置了
self.pos\u start
。我也看不到它在该类的其他方法中被设置。我猜不出在该位置应该设置什么。
def make_tokens(self):
    tokens = []
    while self.current_char != None:
      if self.current_char in ' \t':
        self.advance()
      elif self.current_char in DIGITS:
        tokens.append(self.make_number())
      elif self.current_char == "+":
        tokens.append(Token(TT_PLUS))
        self.advance()
      elif self.current_char == "-":
        tokens.append(Token(TT_MINUS))
        self.advance()
      elif self.current_char == "*":
        tokens.append(Token(TT_MUL))
        self.advance()
      elif self.current_char == "/":
        tokens.append(Token(TT_DIV))
        self.advance()
      elif self.current_char == "(":
        tokens.append(Token(TT_LPAREN))
        self.advance()
      elif self.current_char == ")":
        tokens.append(Token(TT_RPAREN))
        self.advance()
      else:
        self.pos.copy()
        char = self.current_char
        self.advance()
        return [], IllegalCharError(pos_start, self.pos, "'" + char +"'")