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

2024-04-26 18:43:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望这个问题是有意义的,我已经花了整整两天的时间试图解决这个问题。你知道吗

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

一点背景:

从specint.org网站,我可以下载csv文件,其中包含处理器和服务器的基准信息。我的应用程序的想法是执行以下操作:

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

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

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

  4. 一旦我下载并处理了这两个服务器的信息,我会应用一些简单的数学,并返回类似这样的结果:“服务器1比服务器2快/慢10%”或类似的结果。

正如您可能想象的那样,这将需要大量的重复代码,因此它似乎是类的最佳用例。我做了一些测试,结果很有希望。你知道吗

然而,我的问题是,我还没有弄清楚如何捕获用户输入、测试输入、下载相应的csv文件以及以每个实例的方式传递用户输入,而不必在某个地方复制代码。我一直在搜索,它似乎是我所需要的,但我不确定,因为它的使用对我来说仍然是相当深奥的(我是一个新手)(参考: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就是答案,但我希望能得到任何指导,希望能有一些示例代码,这样我就可以完全掌握这些概念。你知道吗


Tags: 文件csv代码self服务器信息inputmodel
2条回答

这是一个很长的问题,所以我希望我能正确地遵循你的想法,如果我做到了,你可以做如下事情:

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或instance方法(self)。如果您的实例有一个状态,而等价于run的实例使用该状态(例如与DB的连接),那么它应该是一个实例方法。你知道吗

您可以这样做:

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来做一些簿记。但是如果簿记越来越复杂,可以考虑使用classes进行“自动”簿记。 这些类可以是pickledjsonified和其他方法,用于将它们保存到数据库中。你知道吗

如果你共享更多的代码,我们可以提供更多帮助。 无论如何,我建议你把这个问题贴在code review上进行更深入的分析。你知道吗

相关问题 更多 >