джанго лямбда и джанго-активность-стрим - PullRequest
1 голос
/ 21 марта 2011

Я не знаком с самой лямбда-функцией и не знаю, как отладить эту проблему.

Django-1.1.2

Я использую, django-activity-stream для отображения потоков активности для моих пользователей.В документации к этим пунктам говорится, что вам нужно передать две лямбда-функции для включения в существующие newtworks, такие как django-friends (тот, который я использую)

Вот функции, которые нужно вставить вВаш файл 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 ]

1 голос
/ 21 марта 2011

Вы должны убедиться, что функции get_people_i_follow и get_my_followers импортированы в ваши файлы настроек.

например:.


from activity_stream.models import get_people_i_follow, get_my_followers

Лямбда - это просто сокращение для определения функции так:


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 голос
/ 21 марта 2011

Где-то выше, где определены эти лямбды, вам нужно импортировать имена get_people_i_follow и get_my_followers.Я не знаком с django-activity-stream, но это, вероятно, что-то вроде from activity_stream import get_people_i_follow, get_my_follwers.

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)
0 голосов
/ 21 марта 2011

Если вы интегрируетесь с уже существующей сетью, я не верю, что вы действительно должны писать дословно:

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 необходимо установить лямбда или функцию, которая принимает один пользовательский аргумент и возвращает список пользователей.Возможно, вам следует искать что-то вроде friends_for_user в django-friends или писать свои собственные функции для реализации этой функциональности.

get_people_i_follow действительно определено в activity_stream.models, но оно просто импортирует то, что определено вsettings.py.Так что если settings.py имеет ACTIVITY_GET_PEOPLE_I_FOLLOW = lambda user: get_people_i_follow(user), вы получите дикий и безумный циклический импорт / бесконечную рекурсию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...