#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.