GoogleCloudPlatform / GoogleCloudPlatform/functions-framework-python

Update type check in `get_user_function` to accept Callable instead of only types.FunctionType

Abierto
#317 0 comentarios 0 reacciones 0 asignados Ver en GitHub
enhancement P3
Lenguaje dominante
Python
Estrellas
968
Forks
128
Métricas de merge de PR
Sin PR fusionados en 30 d

Descripción

I am making an adapter for running ASGI applications in GCP Cloud Function. ([Repo](https://github.com/junah201/vellox))
Simply, I want to run my ASGI application (such as FastAPI or Django) in Cloud Function.

My adapter(`Vellox`) works like this:
```py
from fastapi import FastAPI
from vellox import Vellox

app = FastAPI()

@app.get("/")
def read_root():
return {"Hello": "World"}

@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}

vellox = Vellox(app=app, lifespan="off")

def handler(request):
return vellox(request)
```

I confirmed that my adapter (vellox) works "hello world" example properly. But `functions_framework` throw error when handler is not `types.FunctionType`. In abvoe code, handler is instance of `Vellox` and also it is callable.
The code below is the part that is problematic.

```py
# src/functions_framework/_function_registry.py

def get_user_function(source, source_module, target):
"""Returns user function, raises exception for invalid function."""

# . . .

function = getattr(source_module, target)
# Check that it is a function
if not isinstance(function, types.FunctionType):
raise InvalidTargetTypeException(
"The function defined in file {source} as '{target}' needs to be of "
"type function. Got: invalid type {target_type}".format(
source=source, target=target, target_type=type(function)
)
)
return function
```

Instead of forcing the function type to be function, I suggest changing it to `Callable`, which has a slightly wider scope.

Guía de contribución

Abrir la guía de contribución

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.