Skip to content

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

@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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions