Можно ли получить DocString типизированного свойства класса в Python 3? - PullRequest
1 голос
/ 14 апреля 2020

Я работаю с модулем typing в Python 3, чтобы посмотреть, как далеко я могу растянуть его для DSL. Чтобы использовать этот DSL, я бы хотел извлечь строки DocStrings некоторых пользовательских классов, таких как этот:

class MyRecord:
    """
    This is just a foo.

    Wouldn't it be cool if you could extract this DocString's text at runtime?
    """
    foo: str

Я искал и нашел PEP 526 но это ничего не говорит мне об использовании DocStrings для этого случая. Единственная информация, которую я смог найти, - о том, как встроить информацию о типе в DocString, но это не то, что мне нужно.

FWIW, Python не жалуется при подаче этого примера выше. Однако он также, похоже, не заполняет атрибут __doc__. Правильно ли я считаю, что в настоящее время это не является частью стандарта и поэтому не поддерживается?

Обновление: Я проделал ужасную работу, объясняя, чего я пытаюсь достичь. Я опубликовал ответ, содержащий гораздо лучший пример:

class MyRecord:
    foo: str
    """
    This is a foo.
    """
    bar: str
    """
    This is a bar.
    """

Как и следовало ожидать, в текущей спецификации нет доступа к этим данным. Единственное решение - разобрать AST и извлечь его оттуда, например, inspect.getsource().

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Строки документов могут быть извлечены из любого объекта python либо с помощью встроенного help(obj), используя inspect.get_doc(obj) или obj.__doc__.

import inspect

class MyRecord:
    """
    This is just a foo.

    Wouldn't it be cool if you could extract this DocString's text at runtime?
    """
    foo: str

>>> inspect.getdoc(MyRecord)
"This is just a foo.\n\nWouldn't it be cool if you could extract this DocString's text at runtime?"

Подсказку типа можно прочитать во время выполнения с помощью печатный модуль:

(import typing)
>>> typing.get_type_hints(MyRecord)
{'foo': str}
0 голосов
/ 14 апреля 2020

Хорошо, я был невероятно глуп. Конечно, первая DocString в примере - это класс DocString , который никогда не ассоциируется с методом / свойством.

Это был бы лучший пример:

class MyRecord:
    foo: str
    """
    This is a foo.
    """
    bar: str
    """
    This is a bar.
    """

Но, к сожалению, это не доступно в текущей реализации CPython, и я не уверен, что это когда-либо будет

...