Python中每个实例的输入,测试和输出

时间:2017-10-15 19:38:38

标签: python python-3.x

我希望这个问题有道理,我一直试图弄清楚这两天。

我正在尝试创建一个非常小的脚本,然后我可以将其转换为Flask Web应用程序,用于比较SPECint处理器分数。

一些背景知识:

从specint.org,我可以下载包含有关他们已经过基准测试的处理器和服务器的基准信息的csv文件。我的应用程序的想法是执行以下操作:

  1. 向用户询问他们需要的基准(cint或rint),即服务器 模型,以及他们感兴趣的处理器。必须这样做 两次,对于服务器1和服务器2,所以我可以比较它们。

  2. 我需要检查他们输入的信息是否正确, 即如果有人输入处理器名称XYZ,它应该提出一个 输入有效查询的错误和提示。为此,我计划好了 将整个数据库的一个版本转储到我自己的数据库中,所以我 可以在实际下载csv文件之前执行检查 服务器。

  3. 如果输入的信息有效,我会动态生成正确的网址,以便直接从SPECint的服务器下载和阅读包含基准分数信息的csv文件。

  4. 一旦我下载并处理了两台服务器的信息,我会应用一些简单的数学运算并返回结果,如下所示:"服务器1比服务器2快10%/更快&#34 ;或类似的东西。

  5. 正如您可能想象的那样,这将需要大量重复的代码,因此它似乎是一个完美的用例。我一直在进行一些测试,结果很有希望。

    然而,我的问题是我无法弄清楚如何捕获用户输入,测试输入,下载相应的csv文件,并以每个实例的方式传递所有用户输入,而不必在某处重复代码。我一直在搜索和搜索,似乎@classmethod是我需要的,但我不确定,因为它的使用对我来说似乎仍然很深奥(我是新手)(参考:Example of Class with User Input

    例如,这有点起作用:

    我的课程:

    class Baseline:
        def __init__(self, benchmark, model, processor):
            self.benchmark = benchmark
            self.model = model
            self.processor = processor
    

    捕获并打印实例结果。

    old_server = inputs.Baseline(test=input("Select benchmark: "),
                                 model=input("Enter model: "),
                                 processor=input("Enter processor: ")
                                 )
    new_server = inputs.Baseline(test=input("Select benchmark: "),
                                 model=input("Enter model: "),
                                 processor=input("Enter processor: ")
                                 )
    
    print(old_server.benchmark)
    print(old_server.model)
    print(new_server.benchmark)
    print(new_server.model)
    

    正如您所看到的,我已经重复了代码,相反,我想在课堂上做所有事情,所以我可以简单地调用它的实例来捕获,测试,下载,并返回结果。正如我之前所说,@classmethod似乎是答案,但我很欣赏任何指导,希望通过一些示例代码来完全掌握这些概念。

2 个答案:

答案 0 :(得分:0)

这是一个很长的问题,所以我希望我能正确地遵循你的漂移,如果我这样做,你可以做类似的事情:

class BaseLine(object):
    @classmethod
    def run(cls):
        benchmark = raw_input('Enter benchmark please: ')
        model = raw_input('Enter model please: ')
        processor = raw_input('Enter processor please: ')

        yes_no = raw_input('you picked %s, %s, %s - are you sure? (y/n) ' % (benchmark, model, processor))

        if yes_no.lower() == 'y':
            print('Great Sucess!')
            return benchmark, model, processor
        else:
            return cls.run()

你的主要是:

benchmark1, model1, processor1 = BaseLine.run()
benchmark2, model2, processor2 = BaseLine.run()

这是一个简化的案例,根据您所做的检查以及如何构建代码,您应该设计是否使用classmethod或实例方法(self)。如果您的实例具有状态,并且您的等效项run使用该状态(例如,与DB连接),那么它应该是实例方法。

答案 1 :(得分:0)

你可以这样做:

class Baseline:
    def __init__(self):
        self.benchmark = input("Select benchmark: ")
        self.model = input("Enter model: ")
        self.processor = input("Enter processor: ")

这将使您的代码更少重复,因为创建新实例将是:

old_server = inputs.Baseline()
new_server = inputs.Baseline()

旁注您还可以实施__str__方法将其全部打印出来:

def __str__(self):
    return '\n'.join(str(item) for item in self.__dict__.values())

然后打印很简单:

print(old_server)

作为一般建议,我不会指望用户对处理器模型和基准测试的“免费”输入,因为大多数时候它包含小写,大写数字等的混合。

我会做什么,特别是因为你说你想要使用Flask(这样会更简单),只是缩小到你只支持的处理器模型和基准。实现方式这意味着您的应用程序上的下拉列表列表以及setlist模型,基准等等。这也将为您节省输入验证。

如果并非所有模型都使用所有基准测试,您可以使用dict进行一些簿记。 如果簿记变得复杂,请考虑使用class es进行“自动”记账。 然后,这些类可以是pickledjsonified以及其他用于将它们保存到数据库中的方法。

如果您分享更多代码,我们可以提供更多帮助。 无论如何,我建议您在code review上发布此问题,以便进行更深入的分析。