python - 调用依赖方法的最 Pythonic 方式

标签 python

我有一个只有几个方法的类 - 每个方法都设置一些内部状态,并且通常需要首先调用一些其他方法,以准备阶段。 典型的调用如下:

c = MyMysteryClass()
c.connectToServer()
c.downloadData()
c.computeResults()

在某些情况下,只会调用 connectToServer() 和 downloadData() (甚至只调用 connectToServer())。

问题是:当这些方法以错误的顺序调用时(或者换句话说,当内部状态尚未准备好执行其任务时),这些方法应该如何表现?

我看到两种解决方案:

  • 他们应该抛出异常
  • 他们应该在内部调用正确的先前方法

目前我正在使用第二种方法,因为它允许我编写更少的代码(我可以只编写 c.computeResults() 并知道如果需要的话将调用其他两个方法)。另外,当我多次调用它们时,我不必跟踪已经调用的内容,因此我可以避免多次重新连接或下载。

另一方面,从调用者的角度来看,第一种方法似乎更可预测,并且可能更不容易出错。

当然,有可能采用混合解决方案:抛出和异常,并添加另一层具有内部状态检测和正确调用先前方法的方法。但这似乎有点过分了。

你的建议?

最佳答案

他们应该抛出异常。正如《Python 之禅》中所说: Explicit is better than implicit.并且,就此而言,Errors should never pass silently. Unless explicitly silenced.如果这些方法被无序调用,那就是程序员的错误,并且您不应该尝试通过猜测它们的含义来解决这个问题。您可能会意外地以一种看似可行的方式掩盖了疏忽,但实际上并不能准确反射(reflect)程序员的意图。 (那个程序员可能就是 future 的你。)

如果这些方法通常被立即一个接一个地调用,您可以考虑通过添加一个简单地连续调用它们的新方法来整理它们。这样您就可以使用该方法而不必担心出错。

请注意,有时需要以这种方式处理内部状态的类,但实际上通常不是必需的。根据您的用例和应用程序其余部分的需求,您可能最好使用函数来执行此操作,并实际将连接对象等从一种方法传递到另一种方法,而不是使用类来存储内部状态。例如,参见Stop Writing Classes 。这只是需要考虑的事情,而不是必须的;许多理性的人不同意停止写类(class)背后的理论。

关于python - 调用依赖方法的最 Pythonic 方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24876806/

相关文章:

python - Python异常: ConnectionError 10054 An existing connection was forcibly closed by the remote host

python - 在python中同时对不同索引处的列表进行切片

python - 使用 python 分割行并添加分隔符到文本文件

python - Java 中 Comparables 的 Python 等价物是什么?

python - 主窗口中的多个 QGraphicsView 和 QGraphicsScene

python - 在条件列表理解中使用 or 语句来过滤数据框中的列

Python NLTK Classifier.train(trainfeats)... ValueError : need more than 1 value to unpack

python - 如何使用 numpy 和 strides 来提高循环性能

python - 如何使用 groupby 减去列中的值

python - 如何处理 Python 模块中的冗余/重复导入?