Skip to content

Support for postponed annnotations #291

Open
@haizaar

Description

@haizaar

Consider main.py:

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)=<class 'str'>
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 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    P2bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions