python - 传递一个期望函数对象的参数

时间:2016-04-12 12:59:37

标签: python

我正在使用exoredis,一个可以作为缓存使用的键值存储。 它有一个方法get_or_set,如果它不存在,则设置密钥的值。

exoredis.get_or_set('my_new_key', 'my new value')

这里,my new value也可以是一个可调用的,它返回一个字符串,如:

exoredis.get_or_set('some-timestamp-key', datetime.datetime.now)

就我而言,我的callable需要接受一个参数“pk”:

def get_gender(pk):
    return Users.objects.filter(pk=pk).gender

如何将此函数作为可调用函数传递? 这给了我一个TypeError说我的函数需要一个参数。 (如果它被执行)

pk = request.user.id
print exoredis.get_or_set("gender:%s"%pk, get_gender)

TypeError: get_gender() takes exactly 1 argument (0 given)

每次都执行该功能:

pk = request.user.id
print exoredis.get_or_set("gender:%s"%pk, get_gender(pk))

2 个答案:

答案 0 :(得分:2)

执行此操作的方法是将单参数函数包装在零参数函数中,然后将该零参数函数传递给需要零参数函数的函数。

正如我在评论中提到的,这里有两种选择:
1)当最终调用包装函数时,使用其参数的当前值调用它 2)当最终调用包装函数时,使用其参数在包装时具有的旧值调用它。

以下代码说明了这两个选项。

class Test(object):
    def __init__(self, f):
        self.f = f

def myfunc(s):
    return 'myfunc ' + s

s = 'hello'
a = Test(lambda: myfunc(s))
s = 'bye'
print(a.f())

s = 'hello'
a = Test(lambda s=s: myfunc(s))
s = 'bye'
print(a.f())    

<强>输出

myfunc bye
myfunc hello

&#34;技巧&#34;第二个选项中使用的是将参数设置为默认参数,因为在执行函数定义时,即在创建函数时,会计算默认参数。

从技术上讲,lambda s=s: myfunc(s) 实际上是一个arg函数,但是我们可以用零参数调用它,它将使用提供的默认值作为参数。

答案 1 :(得分:1)

pk = request.user.id
print exoredis.get_or_set("gender:%s"%pk, lambda: get_gender(pk))

传入一个不带参数的lambda函数。这将确保以后而不是立即调用get_gender