mkdocstrings / pytkdocs

Load Python objects documentation.
https://mkdocstrings.github.io/pytkdocs
ISC License
50 stars 32 forks source link

[BUG] use of `set` as class attribute type causes exception #139

Closed JoeHCQ1 closed 2 years ago

JoeHCQ1 commented 2 years ago

Describe the bug If you define a class attribute's type as set pytkdocs crashes.

To Reproduce

class Example:
    """The example class is a stand-in class for illustration"""

    my_legal_attribute: List[str]

    my_illegal_attribute: set[str]

Expected behavior pytkdocs would parse the attributes without breaking.

Error text

ERROR    -  mkdocstrings: 'type' object is not subscriptable
            Traceback (most recent call last):
              File "/home/user/repo/avenv/lib/python3.8/site-packages/pytkdocs/cli.py", line 205, in main
                output = json.dumps(process_json(line))
              File "/home/user/repo/avenv/lib/python3.8/site-packages/pytkdocs/cli.py", line 114, in process_json
                return process_config(json.loads(json_input))
              File "/home/user/repo/avenv/lib/python3.8/site-packages/pytkdocs/cli.py", line 91, in process_config
                obj = loader.get_object_documentation(path, members)
              File "/home/user/repo/avenv/lib/python3.8/site-packages/pytkdocs/loader.py", line 358, in get_object_documentation
                root_object = self.get_module_documentation(leaf, members)
              File "/home/user/repo/avenv/lib/python3.8/site-packages/pytkdocs/loader.py", line 426, in get_module_documentation
                root_object.add_child(self.get_class_documentation(child_node))
              File "/home/user/repo/avenv/lib/python3.8/site-packages/pytkdocs/loader.py", line 483, in get_class_documentation
                merge(attributes_data, get_class_attributes(parent_class))
              File "/home/user/repo/avenv/lib/python3.8/site-packages/pytkdocs/parsers/attributes.py", line 115, in get_class_attributes
                type_hints = get_type_hints(cls)
              File "/usr/lib/python3.8/typing.py", line 1232, in get_type_hints
                value = _eval_type(value, base_globals, localns)
              File "/usr/lib/python3.8/typing.py", line 270, in _eval_type
                return t._evaluate(globalns, localns)
              File "/usr/lib/python3.8/typing.py", line 518, in _evaluate
                eval(self.__forward_code__, globalns, localns),
              File "<string>", line 1, in <module>
            TypeError: 'type' object is not subscriptable
ERROR    -  Error reading page 'reference/api/Example.md':
ERROR    -  Could not collect 'repo.Example'

System (please complete the following information):

Workaround:

class Example:
    """The example class is a stand-in class for illustration"""

    my_legal_attribute: List[str]

    # my_illegal_attribute: set[str]
    my_illegal_attribute = set()
pawamoy commented 2 years ago

A few questions:

JoeHCQ1 commented 2 years ago

I can confirm I am using Python 3.8.

I am using from __future__ import annotations.

I tried your fix, which, added the line to my loader.py file like so: image

And tried again, unfortunately I got the same error. ☹️

I've had vs-code not save when I thought it did sometimes so I verified that the change was there via head ./avenv/lib/python3.8/site-packages/pytkdocs/loader.py and it was in fact there, just not helping.

Thanks though 🙂

pawamoy commented 2 years ago

Thanks for trying! I'll get my hands into it as soon as I get some time :slightly_smiling_face:

pawamoy commented 2 years ago

I can confirm that get_type_hints simply does not support future annotations on Python less than 3.9. So I'm inclined to say that the pytkdocs + future annotations combo is not supported on Python less than 3.9 :confused: If you feel like something could be improved in the code (to bring support or at least fail gracefully), please do open a PR, I will review it.

JoeHCQ1 commented 2 years ago

Thanks for looking into this @pawamoy! I don't have any recommended changes.