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
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__
|
|
)
|