django lambda 和 django-activity-stream

1 投票
3 回答
1243 浏览
提问于 2025-04-16 14:07

我对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 个回答

0

如果你要和一个已经存在的网络进行整合,我觉得你其实不应该直接写出以下内容:

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_FOLLOWACTIVITY_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),那么你就会遇到一个疯狂的循环导入/无限递归的问题。

1

你需要确保在你的设置文件中导入了 get_people_i_followget_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

然后只在需要的时候导入活动流的函数。

更新:看起来定义这些设置其实是个误导:

https://github.com/philippWassibauer/django-activity-stream/blob/master/activity_stream/models.py#L133

如你所见,这些设置只有在你使用默认活动流的时候才需要。所以只需将它们从你的设置文件中删除。

出现段错误可能是因为发生了无限递归,因为 get_people_i_follow 调用了由 ACTIVITY_GET_PEOPLE_I_FOLLOW 定义的函数,而这个函数又调用了 get_people_i_follow 本身……

1

在这些lambda函数定义的上面,你需要导入名字为 get_people_i_followget_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)

撰写回答