Аннотация правильного типа для задачи сельдерея

#python #celery #type-hinting

#python #сельдерей #подсказка типа

Вопрос:

Я ищу аннотацию правильного типа для присвоения задаче сельдерея, которая была установлена декоратором сельдерея @task .

Предположим, у меня есть функция run_task , которая выполняет некоторую задачу сельдерея.

 @task(name='adder')
def add(x, y):
    return x   y


def run_task(taskfn: "?", *a, **kw):
    # do something here
    taskfn.apply_async(args=a, kwargs=kw)
    ...


>>> run_task(add, 1, 2)  # usage
  

Мое замешательство заключается здесь:

 >>> from celery.task import Task
>>> from celery.local import PromiseProxy
>>> type(add).__name__
'PromiseProxy'
>>> isinstance(add, Task)
False
>>> isinstance(add, PromiseProxy)
True
  

Похоже, что PromiseProxy это какой-то «будущий» или «многообещающий» прокси, который содержит задачу (или что-то в этом роде, я не слишком углублялся в это).

Это не было бы проблемой, я мог бы легко сделать taskfn: PromiseProxy , но тогда taskfn.apply_async не имело бы смысла, поскольку apply_async в PromiseProxy нет метода. Итак, мой вопрос в том, должен ли я делать то, что type говорит мне, или думать в терминах duck-typing и идти с Task ?

Комментарии:

1. В качестве быстрого исправления вы могли бы просто объединить оба: taskfn: Union[PromiseProxy, Task]

2. Спасибо, но я бы предпочел этого не делать, потому что это не строгое решение, а также потому, что мне действительно не нужно «исправление». В основном хочу увидеть дискуссию о том, что делать в этих ситуациях

3. Вы могли бы использовать задачу как PromiseProxy, а затем явно преобразовать ее в задачу внутри вашей функции, прежде чем вызывать методы задачи. Возможно, Сельдерею следует реализовать магические методы проверки подкласса / экземпляра, чтобы показать, для какого типа предназначен прокси: docs.python.org/3/reference /…

4. @alkasm спасибо, это отличный совет. Вы имеете в виду приведение через typing : typing.cast(taskfn, Task) ?

5. Да. Это все еще не идеально: это кодифицирует предположение о том, что все возможные прокси-объекты, которые вы получаете, действительно подключаются к задаче. Это, вероятно, разумно для вас, но не является доказательством соответствия типов. Тип прокси действительно нуждается в способе сообщить вам, какой тип он использует для правильного ввода здесь. Тем не менее, приведение здесь лучше, чем объединение, IMO.