flask-script
flask-script copied to clipboard
Error using type hinting in Python 3.5 with manager.command annotation
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)