【问题标题】:Input, test, and output per instance in PythonPython 中每个实例的输入、测试和输出
【发布时间】:2017-10-15 19:38:38
【问题描述】:

我希望这个问题是有道理的,我整整两天都在努力解决这个问题。

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

一点背景:

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

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

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

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

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

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

但是,我的问题是我无法弄清楚如何捕获用户输入、测试输入、下载相应的 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 似乎是答案,但我很感激任何指导,希望有一些示例代码,这样我就可以完全掌握这些概念。

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    这是一个很长的问题,所以我希望我正确地遵循了你的思路,如果我这样做了,你可以这样做:

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

    这是一个简化的案例,取决于您所做的检查以及您应该如何设计使用类方法或实例方法(self)的代码结构。如果您的实例有一个状态,并且您的等价于 run 使用该状态(例如与数据库的连接),那么它应该是一个实例方法。

    【讨论】:

    • 干杯乌里。我会试试这个,@nutmeg64 的回答也是如此,并检查哪一个最适合我的用例。一旦我弄清楚了,我会报告的:)
    【解决方案2】:

    你可以这样做:

    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 以进行更深入的分析。

    【讨论】:

    • 这很有意义。我将尝试代码并阅读一些有关您的建议的内容。我没有更多的代码可以分享,不幸的是,到目前为止,几乎唯一缺少的代码是 csv 阅读器功能。我特别喜欢您对实施的建议,因为我需要它。为所有选项创建一个下拉列表并不可行,因为它们太多了,但是按照您的建议划分它们是一个非常好的主意。我是新手,所以我得在这里做一些功课。一旦我有至少一半功能的东西,我会把它提交给代码审查。干杯!
    猜你喜欢
    • 1970-01-01
    • 2012-07-23
    • 2017-11-03
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    • 1970-01-01
    • 2012-07-06
    相关资源
    最近更新 更多