Skip to content

"TypeError: issubclass() arg 1 must be a class" on Python 3.10 #352

Description

@jmflorezff

Describe the bug
Calling Consumer endpoints that return JSON result in the error:

Traceback (most recent call last):
  File "/working-dir/main.py", line 21, in <module>
    main()
  File "/working-dir/main.py", line 17, in main
    print(client.api_method())
  File "/working-dir/.venv/lib/python3.10/site-packages/uplink/builder.py", line 102, in __call__
    self._request_definition.define_request(request_builder, args, kwargs)
  File "/working-dir/.venv/lib/python3.10/site-packages/uplink/commands.py", line 278, in define_request
    self._method_handler.handle_builder(request_builder)
  File "/working-dir/.venv/lib/python3.10/site-packages/uplink/decorators.py", line 63, in handle_builder
    annotation.modify_request(request_builder)
  File "/working-dir/.venv/lib/python3.10/site-packages/uplink/returns.py", line 64, in modify_request
    converter = self._get_converter(request_builder, return_type)
  File "/working-dir/.venv/lib/python3.10/site-packages/uplink/returns.py", line 184, in _get_converter
    converter = super()._get_converter(request_builder, return_type)
  File "/working-dir/.venv/lib/python3.10/site-packages/uplink/returns.py", line 55, in _get_converter
    return request_builder.get_converter(
  File "/working-dir/.venv/lib/python3.10/site-packages/uplink/helpers.py", line 99, in get_converter
    return self._converter_registry[converter_key](*args, **kwargs)
  File "/working-dir/.venv/lib/python3.10/site-packages/uplink/converters/__init__.py", line 55, in __call__
    converter.set_chain(self)
  File "/working-dir/.venv/lib/python3.10/site-packages/uplink/converters/typing_.py", line 44, in set_chain
    self._value_converter = chain(self._value_type) or self._value_type
  File "/working-dir/.venv/lib/python3.10/site-packages/uplink/converters/__init__.py", line 53, in __call__
    converter = self._converter_factory(*args, **kwargs)
  File "/working-dir/.venv/lib/python3.10/site-packages/uplink/converters/__init__.py", line 115, in chain
    converter = func(factory)(*args, **kwargs)
  File "/working-dir/.venv/lib/python3.10/site-packages/uplink/converters/pydantic_.py", line 72, in create_response_body_converter
    return self._make_converter(_PydanticV1ResponseBody, type_)
  File "/working-dir/.venv/lib/python3.10/site-packages/uplink/converters/pydantic_.py", line 58, in _make_converter
    model = self._get_model(type_)
  File "/working-dir/.venv/lib/python3.10/site-packages/uplink/converters/pydantic_.py", line 50, in _get_model
    if is_subclass(type_, (self.pydantic_v1.BaseModel, self.pydantic.BaseModel)):
  File "/working-dir/.venv/lib/python3.10/site-packages/uplink/utils.py", line 79, in is_subclass
    return inspect.isclass(cls) and issubclass(cls, class_info)
  File "/opt/homebrew/Cellar/python@3.10/3.10.20_1/Frameworks/Python.framework/Versions/3.10/lib/python3.10/abc.py", line 123, in __subclasscheck__
    return _abc_subclasscheck(cls, subclass)
TypeError: issubclass() arg 1 must be a class

To Reproduce
Python version: 3.10

Packages:

  • pydantic>=2.13.4
  • uplink>=0.10.0

Minimal example:

from typing import Dict

from uplink import Consumer, json, returns, get


class ExampleClient(Consumer):
    @json
    @returns.from_json
    @get('api/some/endpoint')
    def api_method(self) -> Dict[str, set[str]]:
        pass


def main():
    client = ExampleClient('https://example.com')

    print(client.api_method())


if __name__ == "__main__":
    main()

Expected behavior
The script prints the result of client.api_method()

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions