GoogleCloudPlatform / GoogleCloudPlatform/functions-framework-python

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

未關閉
#317 0 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視
enhancement P3
主要語言
Python
星號
968
分支
128
PR 合併指標
30 天內沒有已合併 PR

描述

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.

貢獻指南

開啟貢獻指南

評估

這個 Issue 還沒有評估資料。

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。