Skip to content

mypy: Add type hints #477

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open

mypy: Add type hints #477

wants to merge 3 commits into from

Conversation

Daverball
Copy link

Closes: #474

My curiosity got the better of me. So this is the stubs I contributed to typeshed automatically merged into the source using merge_pyi.

Afterwards I cleaned up any mistakes and completed the type hints for the internal API. I added a couple of type tests, but we could definitely add more.

I tried to keep changes to the actual code to a bare minimum. I did however change a couple of minor things. Like remove an unnecessary check for Python 2.7

You can do with these what you want, the diff is fairly large, so it will take some time to review.

@jvanasco
Copy link
Contributor

I think found a typo in your stubs-

You define a Protocol here: https://github.com/python/typeshed/blob/main/stubs/WebOb/webob/cookies.pyi#L29-L31

class _Serializer(Protocol):
    def loads(self, appstruct: Any, /) -> bytes: ...
    def dumps(self, bstruct: bytes, /) -> Any: ...

I think that should read:

class _Serializer(Protocol):
    def dumps(self, appstruct: Any, /) -> bytes: ...
    def loads(self, bstruct: bytes, /) -> Any: ...

It's basically just swapping the function names.

Notice how the input/output are reversed of the other functions: https://github.com/python/typeshed/blob/main/stubs/WebOb/webob/cookies.pyi#L96-L104

class JSONSerializer:
    def dumps(self, appstruct: Any) -> bytes: ...
    def loads(self, bstruct: bytes | str) -> Any: ...

class Base64Serializer:
    serializer: _Serializer
    def __init__(self, serializer: _Serializer | None = None) -> None: ...
    def dumps(self, appstruct: Any) -> bytes: ...
    def loads(self, bstruct: bytes) -> Any: ...

Note that SignedSerializer uses JSONSerializer if no serializer is supplied:

https://github.com/Pylons/webob/blob/main/src/webob/cookies.py#L705-L706

And CookieProfile uses the Base64Serializer

https://github.com/Pylons/webob/blob/main/src/webob/cookies.py#L813-L814

@Daverball
Copy link
Author

@jvanasco Good catch. Feel free to open an issue or PR on typeshed.

jvanasco added a commit to jvanasco/typeshed that referenced this pull request May 21, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Adding type hints
2 participants