【问题标题】:Python: interpreter says "None" after parsing filePython:解析文件后解释器说“无”
【发布时间】:2023-03-07 17:50:01
【问题描述】:

我用 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,但它不能正常工作。我认为这与解释器代码的最后两行有关,但我并不完全确定。

【问题讨论】:

    标签: python command-line-arguments interpreter


    【解决方案1】:

    您只是调用 self.parse 并没有使用它的返回值,并且鉴于self.parse 不输出任何内容并且read 不返回任何内容 (None),您'结果得到None

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

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

    【讨论】:

    • 感谢您的帮助:)
    【解决方案2】:

    你的问题之一是这一行:

    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])
    

    永远没有理由迭代 rangelen。只需遍历令牌:

    for token in tokens:
        self.parse(token)
    

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


    在应用所有这些修复后,要使您的代码按照 ForceBru 所说的和 yield self.parse(token) 工作,或者,为了测试目的,只需在 parse 内进行 print 即可:

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

    那么,您的代码适用于我在 test.tl 文件中的 print(Hi)\n

    【讨论】:

    • 感谢您的帮助,以及额外的提示:)
    猜你喜欢
    • 1970-01-01
    • 2010-10-17
    • 2011-08-29
    • 1970-01-01
    • 2014-03-03
    • 2012-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多