【问题标题】:What is an elegant way to abstract functions - not objects?什么是抽象函数的优雅方式——而不是对象?
【发布时间】:2011-05-13 01:36:06
【问题描述】:

我有一个通过 telnet/pexpect 登录到传感器并充当数据收集器的功能。

我不想重写登录、抓取数据并从中解析出相关输出的部分 (pexpect)。但是,我需要用这段代码和它收集的数据做不同的事情

例如,我可能需要:

  • 距离返回第一个读数的时间

  • 取不同数量传感器读数的平均值

  • 返回状态(即一条数据)或返回传感器 阅读(这是一个单独的部分 数据)来自输出

最终,它仍然应该以相同的方式登录和解析输出,我想为该部分使用一个代码块。

在代码的更高层,它被立即使用。当我调用它时,我知道我需要收集什么类型的数据,仅此而已。构造对象太笨拙了。

我的使用已经超过了向单个函数添加更多参数。

有什么想法吗?

【问题讨论】:

  • Python 只有几个全局结构:函数、对象、类、模块。是什么让你觉得“构造对象太笨拙”?
  • 这样,在功能上,我需要像使用方法一样使用它并执行一个方法,一次。为此实例化一个类似乎很麻烦。
  • 也许您可以使用某种 Builder 模式? Sensor().timeInitial().calcAverage().returnStatus().go()
  • 类方法可能吗?他们可以在类中存储共享状态。
  • 我不知道你有什么反对类。为传感器连接创建一个可以记录有关连接的元数据(时间等)的类似乎是一个整洁的解决方案。

标签: functional-programming python abstraction pexpect


【解决方案1】:

这种情况很常见,我很惊讶你还没有像其他人那样做。

重构您的函数以将其分解为更小的函数。

函数是对象,可以作为参数传递给其他函数。

def step1(): 
    whatever

def step2(): 
    whatever

def step2_alternative():
    whatever

def original( args ):
    step1()
    step2()

def revised( args, step2_choice ):
    step1()
    step2_choice()

现在你可以这样做了。

revised( step2 )
revised( step2_alternative )

这只是使用函数对象的 OO 编程。

【讨论】:

  • +1 表示随意提醒,是的,即使函数也是对象。
  • 这就是我最终要做的,谢谢。基本上,我将所有内容分解为非常简单的子函数,并使用了一个公共接口函数,其中包含子函数交互方式/时间/顺序的所有业务逻辑。谢谢!
【解决方案2】:

您能否将数据处理函数传递给您描述为参数的函数?

这可能或多或少是优雅的,这取决于你的品味。 (原谅我:我对pexpect一无所知,我什至可能误解了你的问题!)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 1970-01-01
    • 2015-02-22
    • 2020-07-06
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多