Skip to content

Type-hinted list arg causes "TypeError: Injecting partially applied functions is no longer supported." #50

Open
@macdjord

Description

@macdjord

How to reproduce:

test_app.py:

import connexion
from connexion.resolver import RestyResolver
from flask_injector import FlaskInjector

app = connexion.App(__name__)
app.add_api(
    {
        'swagger': '2.0',
        'info': {
            'version': '1.0.0',
            'title': 'Test Service',
            'license': {'name': 'MIT'}
        },
        'basePath': '/api',
        'schemes': ['http'],
        'consumes': ['application/json'],
        'produces': ['application/json'],
        'paths': {
            '/test': {
                'get': {
                    'operationId': 'test_api.test_func',
                    'parameters': [
                        {
                            'name': 'list_arg',
                            'in': 'query',
                            'required': False,
                            'type': 'array',
                            'items': {'type': 'string'},
                            'collectionFormat': 'multi'
                        },
                    ],
                    'responses': {'200': {'description': 'Test endpoint'}},
                }
            },
        },
    },
    resolver=RestyResolver('api'),
)

FlaskInjector(app=app.app, modules=[])

app.run(port=5000)

test_api.py:

import typing as _t

import logging as _logging


def test_func(
        list_arg: _t.List[str],
) -> dict:
    _logging.info(f'{list_arg!r}')
    return {'list_arg': list_arg}

Execute query GET http://test_app:5000/api/test?list_arg=a&list_arg=b

Expected result:

No error, response {'list_arg': ['a', 'b']}

Actual result:

Error occurs:

Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/injector/__init__.py", line 440, in get_binding
    return self._get_binding(key, only_this_binder=is_scope)
  File "/usr/local/lib/python3.7/site-packages/injector/__init__.py", line 435, in _get_binding
    raise KeyError
KeyError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 2446, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1951, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1820, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python3.7/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1949, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1935, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/usr/local/lib/python3.7/site-packages/flask_injector.py", line 76, in wrapper
    return injector.call_with_injection(callable=fun, args=args, kwargs=kwargs)
  File "/usr/local/lib/python3.7/site-packages/injector/__init__.py", line 778, in call_with_injection
    owner_key=self_.__class__ if self_ is not None else callable.__module__,
  File "/usr/local/lib/python3.7/site-packages/injector/__init__.py", line 57, in wrapper
    return function(*args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/injector/__init__.py", line 819, in args_to_inject
    instance = self.get(key.interface)
  File "/usr/local/lib/python3.7/site-packages/injector/__init__.py", line 689, in get
    binding, binder = self.binder.get_binding(None, key)
  File "/usr/local/lib/python3.7/site-packages/injector/__init__.py", line 449, in get_binding
    binding = self.create_binding(key.interface)
  File "/usr/local/lib/python3.7/site-packages/injector/__init__.py", line 369, in create_binding
    provider = self.provider_for(interface, to)
  File "/usr/local/lib/python3.7/site-packages/injector/__init__.py", line 424, in provider_for
    raise TypeError('Injecting partially applied functions is no longer supported.')
TypeError: Injecting partially applied functions is no longer supported.

Affected versions:

pip freeze:

backcall==0.1.0
certifi==2019.3.9
chardet==3.0.4
Click==7.0
clickclick==1.2.2
colorful==0.5.4
connexion==2.6.0
coverage==4.5.3
decorator==4.4.1
elasticsearch==6.3.1
elasticsearch-dsl==6.4.0
fastavro==0.21.19
Flask==1.1.1
Flask-Injector==0.11.0
idna==2.7
inflection==0.3.1
injector==0.16.0
ipython==7.12.0
ipython-genutils==0.2.0
itsdangerous==1.1.0
jedi==0.16.0
Jinja2==2.11.1
jsonschema==2.6.0
MarkupSafe==1.1.1
openapi-spec-validator==0.2.6
parso==0.6.1
pathlib==1.0.1
pexpect==4.8.0
pickleshare==0.7.5
pika==0.13.1
prettyprinter==0.18.0
prompt-toolkit==3.0.3
ptyprocess==0.6.0
Pygments==2.5.2
python-dateutil==2.8.1
PyYAML==5.1
redis==3.2.1
requests==2.20.1
six==1.12.0
traitlets==4.3.3
typing==3.6.6
urllib3==1.24.1
wcwidth==0.1.8
Werkzeug==0.15.1

Notes:

  • If the type hint List[str] is removed from the argument list_arg, the injection works correctly

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions