django lambda 和 django-activity-stream
我对lambda函数不太熟悉,也不知道该怎么调试这个问题。
我使用的是Django-1.1.2。
我在用django-activity-stream来为我的用户展示活动流。在这个项目的文档里说,要想和现有的网络(比如我正在使用的django-friends)结合使用,你需要传入两个lambda函数。
下面是需要放到你的settings.py文件里的函数。
ACTIVITY_GET_PEOPLE_I_FOLLOW = lambda user: get_people_i_follow(user)
ACTIVITY_GET_MY_FOLLOWERS = lambda user: get_my_followers(user)
我已经这么做了,但每次我尝试渲染使用这个的页面时,都会出现以下错误信息。
Caught NameError while rendering: global name 'get_people_i_follow' is not defined
虽然我在设置里已经配置了这些...
非常感谢你的帮助!
3 个回答
如果你要和一个已经存在的网络进行整合,我觉得你其实不应该直接写出以下内容:
ACTIVITY_GET_PEOPLE_I_FOLLOW = lambda user: get_people_i_follow(user)
ACTIVITY_GET_MY_FOLLOWERS = lambda user: get_my_followers(user)
我认为作者只是举了个例子,说明 ACTIVITY_GET_PEOPLE_I_FOLLOW
和 ACTIVITY_GET_MY_FOLLOWERS
需要设置成一个接受一个用户参数并返回用户列表的函数或者lambda表达式。你可能应该去找像 friends_for_user
这样的函数,或者自己写一些函数来实现这个功能。
get_people_i_follow
确实是在 activity_stream.models
中定义的,但它只是导入了在 settings.py 中定义的内容。所以如果 settings.py 里有 ACTIVITY_GET_PEOPLE_I_FOLLOW = lambda user: get_people_i_follow(user)
,那么你就会遇到一个疯狂的循环导入/无限递归的问题。
你需要确保在你的设置文件中导入了 get_people_i_follow
和 get_my_followers
这两个函数。
比如:
from activity_stream.models import get_people_i_follow, get_my_followers
Lambda其实就是定义一个函数的简写,所以:
ACTIVITY_GET_PEOPLE_I_FOLLOW = lambda user: get_people_i_follow(user)
这和下面的内容是一样的:
def activity_get_people_i_follow(user):
return get_people_i_follow(user)
ACTIVITY_GET_PEOPLE_I_FOLLOW = activity_get_people_i_follow
仔细想想,这种情况下你并没有获得太多好处。不过,如果你需要避免在设置文件中太早导入这些函数(比如因为循环导入的问题),那么你可以这样做:
def activity_get_people_i_follow(user):
from activity_stream.models import get_people_i_follow
return get_people_i_follow(user)
ACTIVITY_GET_PEOPLE_I_FOLLOW = activity_get_people_i_follow
然后只在需要的时候导入活动流的函数。
更新:看起来定义这些设置其实是个误导:
如你所见,这些设置只有在你不使用默认活动流的时候才需要。所以只需将它们从你的设置文件中删除。
出现段错误可能是因为发生了无限递归,因为 get_people_i_follow
调用了由 ACTIVITY_GET_PEOPLE_I_FOLLOW
定义的函数,而这个函数又调用了 get_people_i_follow
本身……
在这些lambda函数定义的上面,你需要导入名字为 get_people_i_follow
和 get_my_followers
的函数。我对django-activity-stream不太熟悉,但它可能是类似于 from activity_stream import get_people_i_follow, get_my_followers
这样的写法。
lambda是一个用来快速创建匿名函数的关键词,所以你的代码的意思基本上和你写下面的代码是一样的。
def ACTIVITY_GET_PEOPLE_I_FOLLOW(user):
return get_people_i_follow(user)
def ACTIVITY_GET_MY_FOLLOWERS(user):
return get_my_followers(user)