在 python 中充当参数

Function as argument in python

我需要将一些函数作为参数传递给另一个函数。所以,我想每秒将当前时间添加到 class 属性,例如

import time
class Measurement():
    values = []
    def add_value(self, value):
        print "added value"
        self.values.append(value)


def smart_delay(input_function,args):
    start_time = time.time()
    while 5 > (time.time() -  start_time):
        print "Calling function"
        input_function(args)
        time.sleep(1)

measurement = Measurement()

smart_delay(measurement.add_value,time.time())

好的,但是在检查 measurement.values 的内容后,我明白了 [1425980407.173, 1425980407.173, 1425980407.173, 1425980407.173] - 所以值是一样的!!! 发生了什么?以及如何获得正确的值?

更新:

实际上,这个问题是关于允许调用某个函数的方式,作为参数传递给另一个函数。你怎么看这个:

import time

class Measurement():
    values = []
    def add_value(self, value):
        print "added value"
        self.values.append(value)


def smart_delay(input_function):
    start_time = time.time()
    while 5 > (time.time() -  start_time):
        print "Calling function"
        input_function()
        time.sleep(1)

measurement = Measurement()

smart_delay(lambda: measurement.add_value(time.time()))

您对 time.time() 的调用在对 smart_delay(...) 的调用之前执行,因此 smart_delay(measurement.addvalue, time.time()) 将首先从 time.time() 获取 return 值并将其传递转发到 smart_delay.

您需要传递 time.time 函数本身,并在 smart_delay 方法内部调用它,而不是传递它的 return 值:

import time
class Measurement():
    values = []
    def add_value(self, value):
        print "added value"
        self.values.append(value)


def smart_delay(output_f, input_f):
    start_time = time.time()
    while 5 > (time.time() -  start_time):
        print "Calling function"
        output_f(input_f())
        time.sleep(1)

measurement = Measurement()

smart_delay(measurement.add_value, time.time)

请注意,这不是您正在做的事情的最佳方式,但它确实有效。


这是我的做法:

import time

# Why do you need a measurement class which only acts as a list anyways?
my_measurements = []

def repeat(duration, function, args=(), kwargs={}, interval=1):
    """Repeat a function call for the given duration."""
    start_time = time.time()
    while duration > time.time() - start_time:
        function(*args, **kwargs)
        time.sleep(interval)

def add_time_measurement(measurements):
    measurements.append(time.time())

repeat(5, add_time_measurement, (my_measurements,))

如果你想要一些照片,你可以在 add_time_measurement 函数中添加它们。