包含要执行的命令的Python输入文件

时间:2018-02-02 10:54:57

标签: python python-3.x unit-testing

我正在进行一项练习,我正在创建Python 3函数,用于创建和修改基于Python列表构建的堆栈。我的函数名称包括:createstack()pop()push()等。 是否可以创建一个包含一系列将执行各种功能的命令的输入文本文件?我的代码结构目前是:

def createstack():
.
.
def pop(stackin,data):
.
.
.
def push(stackin,data):
.
.
.
#main

我可以通过编码来测试函数,例如代码主要部分中的push(stack3,"dog")。 我可以通过将pushpopcreatestack等放在一个文件中来实现相同的测试,并且我的例程可以以某种方式读取文件然后执行每一行,就像它在主文件中一样我的Python模块的一部分?

我正在使用IDLE开发和运行代码。

2 个答案:

答案 0 :(得分:4)

你应该看看这个教程,你应该可以从其他python文件中导入你的文件:

https://en.wikibooks.org/wiki/A_Beginner%27s_Python_Tutorial/Importing_Modules

答案 1 :(得分:0)

正如他们所说的那样,正确的方法是导入模块并将其作为常规python文件运行,如果你真的想要一个纯文本文件,你可以购买某种类似的玩具语言:

push, "dog"
push, 3
push, False
pop
pop

然后做一些事情来解析它:

from mystack import createstack, push, pop

class MyLangParser:
    COM_POP = "POP"
    COM_PUSH = "PUSH"

    def __init__(self):
        self.stack = createstack()

    def push(self, val):
        push(self.stack, val)

    def pop(self):
        return pop(self.stack)

    def parse(self, filename):
        with open(filename, "r") as f:
            data = f.readlines()
        for line in data:
            self.parse_line(line)
            print(self.stack)

    def parse_line(self, line):
        try:
            command, val = line.split(",")
            if command.strip().upper() == self.COM_PUSH:
                self.push(eval(val.strip())) # I don't like this, but it is the easiest (most dangerous) way.
            elif command.strip().upper() == self.COM_POP:
                self.pop()
            else:
                raise SyntaxError("Command not recognized")
        except ValueError:
            if line.strip().upper() == self.COM_POP:
                self.pop()
            else:
                raise SyntaxError("Command not recognized")

if __name__ == "__main__":
    parser = MyLangParser()
    parser.parse(sys.argv[1])

使用前面的示例和以下函数

def createstack():
    return []

def push(alist, val):
    alist.append(val)

def pop(alist):
    return alist.pop()

输出是:

['dog']
['dog', 3]
['dog', 3, False]
['dog', 3]
['dog']

我希望你能够认识到这样做的正确方法是从其他python文件导入模块。