Разница между обычным def и лямбдой для обратного преобразования url в django test [duplicate]

Рассмотрите следующие два примера и объясните мне, чем они отличаются (на мой взгляд, они выглядят одинаково, но лямбда работает не так, как ожидалось)

Используя лямбду, я продолжаю получать следующую ошибку:

TypeError: SurveyConversationViewSetTestCase.setUpTestData.<locals>.<lambda>() missing 1 required positional argument: 'pk'

вложенный url

/api/surveys/<survey_pk>/survey-conversations/<pk>/ survey_conversations.views.SurveyConversationViewSet    survey-conversations-detail

Тест

class SurveyConversationViewSetTestCase(UserSetupMixin, APITestCase):
    @classmethod
    def setUpTestData(cls):
        super().setUpTestData()

        cls.update_url = lambda self, pk: reverse(
            "survey-conversations-detail", kwargs={"survey_pk": cls.survey.pk, "pk": pk}
        )

    def get_update_url(self, pk):
        return reverse(
            "survey-conversations-detail",
            kwargs={"survey_pk": self.survey.pk, "pk": pk},
        )


    # this fails
    def test_with_lambda(self):
        response_create = self.client.post(
            self.create_url, {"participant_id": self.participant.pk}
        )
        conversation_id = response_create.data["conversation_id"]
        self.client.patch(self.update_url(str(conversation_id)),{"answer": "Walking"})

    # this passes
    def test_with_def(self):
        response_create = self.client.post(
            self.create_url, {"participant_id": self.participant.pk}
        )
        conversation_id = response_create.data["conversation_id"]
        update_url = self.get_update_url(conversation_id)
        response = self.client.patch(update_url, {"answer": "Walking"}, format="json")

Вернуться на верх