celery.shared_task()でタスクを作成するときに`bind=True`を指定すると、第一引数がそのタスクオブジェクトになります。

from celery import Celery, shared_task

app = Celery('tasks', broker='redis://127.0.0.1:6379/')


@shared_task(bind=True, default_retry_delay=1, max_retries=3)
def add(self, x, y):
    print(x, y)
    return x + y

res = add.delay(1, 3)
print(res.wait())

ステータスをfailureにしたり、リトライを指定する場合、タスク関数自身(実際は関数ではなくて呼び出し可能オブジェクトですが)にその処理を指定する必要がありましたが、見た目上それは関数なので非常に不自然なコードになっていました。

bind=Trueを使うとselfに対してステータスの変更やリトライを指定できるのでより自然なコードになります。ただし関数呼び出しする場合にはそのtask object相当のものを渡す必要があります。