Разница между обычным 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")