我正在使用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))
答案 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
。