for 루프에서 transaction.on_commit을 사용할 때 콜백 함수에 인자를 올바르게 넘기는 방법
두줄요약
Django `transaction.on_commit` 콜백에서 루프 변수 지연 평가로 마지막 사용자만 반복 처리되는 원인을 설명했습니다. 람다 기본 인자로 현재 값을 고정해 각 사용자에게 알림을 보내는 방법을 소개합니다.
문제 상황
- Django
transaction.on_commit과for루프 조합에서 당첨자별 알림 발송 필요 lambda send_notification(user)등록 시 마지막 사용자에게만 알림 반복 발송
원인 분석
- 커밋 이후 콜백 실행 시점에 루프 변수
user를 참조하는 지연 평가 문제 on_commit이 별도 인자 없이 호출하는 매개변수 없는 콜백 등록 방식
해결 방법
- 람다 매개변수의 기본값으로 현재 루프 변수 고정
lambda user=user: send_notification(user)형태로 사용자별 콜백 생성
주의할 점
lambda user: send_notification(user)는 필수 인자를 요구하므로on_commit콜백으로 사용 불가- 루프 내부 비동기·지연 실행 콜백에서 변수 캡처 시점 확인 필요


