GoogleCloudPlatform / GoogleCloudPlatform/functions-framework-python

Support for postponed annnotations

未关闭
#291 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
bug P2
主要语言
Python
星标
968
派生
128
PR 合并指标
30 天内没有已合并 PR

描述

Consider `main.py`:
```python
from __future__ import annotations
import functions_framework
import flask

class HelloRequest:
name: str

def __init__(self, name: str) -> None:
self.name = name

@classmethod
def from_dict(cls, d: dict) -> HellowRequest:
return cls(**d)

def to_dict(self) -> dict:
return self.__dict__

@functions_framework.typed
def hello(hr: HelloRequest) -> flask.typing.ResponseReturnValue:
return f"Hello, {hr.name}"
```

Running `import main` yields:
```
input_type=HelloRequest, type(input_type)=
Traceback (most recent call last):
File "/home/....venv/lib/python3.11/site-packages/functions_framework/_typed_event.py", line 37, in register_typed_event
_validate_input_type(input_type)
File "/home/.../.venv/lib/python3.11/site-packages/functions_framework/_typed_event.py", line 103, in _validate_input_type
raise AttributeError(
AttributeError: The type HelloRequest does not have the required method called 'from_dict'.
```

The culprit is `from __future__ import annotations`, which is required to annotate `from_dict` properly.

The issue is [here](https://github.com/GoogleCloudPlatform/functions-framework-python/blob/main/src/functions_framework/_typed_event.py#L34) where `inspect.signature` will return annotations as strings (by default) if they are postponed.

The suggested solution is to pass `eval_str=True` when calling `inspect.signature`.

贡献指南

打开贡献指南

评估

这个 Issue 还没有评估数据。

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。