Python:解释器说;无”;解析文件后

Python:解释器说;无”;解析文件后,python,command-line-arguments,interpreter,Python,Command Line Arguments,Interpreter,我用Python为自己创建的编程语言编写了一个简单的解释器。不过我有一个小问题:当我试图读取一个文件,以便可以解释代码时,Python会说None 以下是解释器代码: import sys class Interpret: def read(self, cmd): tokens = cmd.split("\n") for i in range(0, len(tokens)): self.parse(tokens[i])

我用Python为自己创建的编程语言编写了一个简单的解释器。不过我有一个小问题:当我试图读取一个文件,以便可以解释代码时,Python会说
None

以下是解释器代码:

import sys

class Interpret:
    def read(self, cmd):
        tokens = cmd.split("\n")
        for i in range(0, len(tokens)):
            self.parse(tokens[i])

    def parse(self, cmd):
        if cmd.startswith("print(") and cmd.endswith(")"):
            cmd = cmd[6:]
            cmd = cmd[:-1]
            return(cmd)

interpret = Interpret()

code = open(sys.argv[1], 'r')
print(interpret.read(str(code)))
下面是我要读取的文件中的代码:
print(Hi)\n
(是的,那里有一个换行符,而不是字符
\n

下面是在CMD中发生的事情:

> python interpreter.py test.tl

None
它应该输出
Hi
,但工作不正常。我认为这与解释器代码的最后两行有关,但我不能完全确定。

您只是调用了
self.parse
,没有使用它的返回值,并且假设
self.parse
不输出任何内容,而
read
不返回任何内容(
None
),因此,您将获得

您可能希望您的
read
在每次迭代中
yield self.parse(tokens[i])
,从而使其成为生成器,然后执行以下操作:

for data in interpret.read(str(code)):
    print(data)

您的问题之一是这一行:

code = open(sys.argv[1], 'r')
open
返回文件对象,而不是文件内容。相反,要:

with open(sys.argv[1], 'r') as f:
    code = f.read()

关于下一期:

for i in range(0, len(tokens)):
    self.parse(tokens[i])
没有理由在
len
范围内进行迭代。只需迭代标记:

for token in tokens:
    self.parse(token)

您的代码打印
None
(正如ForceBru已经编写的那样)是因为您打印的是一个不返回任何内容的方法的返回值。直接调用
explorate.read(str(code))
即可,无需将
print
包装在其周围


应用所有这些修复程序后,要使代码正常工作,请执行ForceBru所说的操作并生成self.parse(token)
,或者出于测试目的,只需在
parse
内部打印

def parse(self, cmd):
    if cmd.startswith("print(") and cmd.endswith(")"):
        cmd = cmd[6:]
        cmd = cmd[:-1]
        print(cmd)

然后,您的代码在
test.tl
文件中的
print(Hi)\n
对我有效。

谢谢您的帮助:)谢谢您的帮助,也谢谢您提供的额外提示:)