Closed
Description
To reproduce, run the following snippet:
import typing
import _pytest.mark
print(typing.get_type_hints(_pytest.mark.Mark.__init__))
Expected:
{'return': <class 'NoneType'>, 'name': <class 'str'>, 'args': typing.List[object], 'kwargs': typing.Dict[str, object]}
Actual:
Traceback (most recent call last):
File ".\example.py", line 3, in <module>
print(typing.get_type_hints(_pytest.mark.Mark.__init__))
File "C:\Python37\lib\typing.py", line 1001, in get_type_hints
value = _eval_type(value, globalns, localns)
File "C:\Python37\lib\typing.py", line 260, in _eval_type
return t._evaluate(globalns, localns)
File "C:\Python37\lib\typing.py", line 464, in _evaluate
eval(self.__forward_code__, globalns, localns),
File "<string>", line 1, in <module>
NameError: name 'List' is not defined
This happens because of these type annotations:
pytest/src/_pytest/mark/structures.py
Lines 122 to 129 in a48c47b
It's probably a minor issue that has no effect on the normal operation of pytest, but it could trip up runtime annotation analysis tools.
If the codebase was Python 3 only, the fix would be trivial:
from typing import List, Dict
...
@attr.s(frozen=True)
class Mark(object):
name = attr.ib(type=str)
args = attr.ib(type=List[object])
kwargs = attr.ib(type=Dict[str, object])
But I'm not sure how to proceed in Python 2/3 codebase, adding the conditionals does not seem justified for such a tiny thing.
Version info:
- Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32
- pytest 3.6.2 or pytest 3.6.3.dev33+ga48c47b5