You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

67 lines
1.6 KiB
Python

from typing import Optional, Tuple, Type, get_type_hints
def get_args(_type: Optional[Type]) -> Optional[Tuple]:
if _type and hasattr(_type, "__args__"):
return _type.__args__
return None
def get_origin(_type: Optional[Type]) -> Optional[Type]:
if _type and hasattr(_type, "__origin__"):
return _type.__origin__
return None
def get_handler_original_typehints(handler):
"""
Retorna a assinatura do handler amqpworker que está sendo decorado.
O retorno dessa chamada é equivalente a:
typing.get_type_hints(original_handler)
Onde `original_handler` é o handler amqpworker original.
Ideal para ser usado na pilha de decorators de um handler, ex:
.. code-block:: python
@deco1
@deco2
@deco3
async def handler(...):
pass
Nesse caso, se qualquer um dos 3 decorators precisar saber a assinatura
original, deve usar essa função passando a função recebida do decorator anterior.
"""
def _dummy():
pass
_dummy.__annotations__ = getattr(
handler, "amqpworker_original_annotations", handler.__annotations__
)
return get_type_hints(_dummy)
def is_base_type(_type, base_type):
"""
Retorna True para argumentos de um tipo base `base_type`.
Ex:
(a: MyGeneric[int]) -> True
(b: MyGeneric) -> True
"""
if get_origin(_type) is base_type:
return True
return issubclass(_type, base_type)
def get_handler_original_qualname(handler):
return getattr(
handler, "amqpworker_original_qualname", handler.__qualname__
)