smurfix/flask-script

Error using type hinting in Python 3.5 with manager.command annotation

martyla opened this issue · 2 comments

I'm trying to use type hinting from PEP 484 valid since Python 3.5, but I'm getting an error: ValueError: Function has keyword-only arguments or annotations, use getfullargspec() API which can support them

Here's a sample:

from flask import Flask
from flask_script import Manager


app = Flask(__name__)
manager = Manager(app)


@manager.command
def test() -> None:
    print('Testing')

if __name__ == "__main__":
    manager.run()

It works fine if I define test() without the -> None annotation

Full stacktrace:

(env)$ python manage.py test
Traceback (most recent call last):
  File "manage.py", line 9, in <module>
    def test() -> None:
  File "/home/martin/tmp/flask-script-error/env/lib/python3.5/site-packages/flask_script/__init__.py", line 285, in command
    command = Command(func)
  File "/home/martin/tmp/flask-script-error/env/lib/python3.5/site-packages/flask_script/commands.py", line 118, in __init__
    args, varargs, keywords, defaults = inspect.getargspec(func)
  File "/usr/lib/python3.5/inspect.py", line 1045, in getargspec
    raise ValueError("Function has keyword-only arguments or annotations"
ValueError: Function has keyword-only arguments or annotations, use getfullargspec() API which can support them

Any ideas?

Seems to be caused by inspect.getargspec, which is deprecated since python 3.0

>>> def test() -> None:
...     print("test")

>>> from inspect import getargspec

>>> getargspec(test)
ptpython3:1: DeprecationWarning: inspect.getargspec() is deprecated, use inspect.signature() instead
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.5/inspect.py", line 1045, in getargspec
    raise ValueError("Function has keyword-only arguments or annotations"
ValueError: Function has keyword-only arguments or annotations, use getfullargspec() API which can support them
Function has keyword-only arguments or annotations, use getfullargspec() API which can support them

Changing the offending line to this solves the problem:

args, varargs, keywords, defaults, _, _, _ = inspect.getfullargspec(func)