Получить аннотации функций в «читаемом» формате - PullRequest
0 голосов
/ 07 февраля 2019

При проверке во время выполнения аннотаций функции можно получить аннотацию class для данного аргумента.Например:

>>> import inspect
>>> inspect.signature(f).parameters['a'].annotation
<class 'int'>

То же самое можно сделать, выполнив f.__annotations__.

Однако, по причинам, которые я пощадил, я хотел бы получить аннотацию в читаемом текстовом формате.,Например: a: int будет получено как int, а не <class 'int'>.Предположим, что текст должен быть допустимым в качестве ввода для eval.

Я знаю, что могу сделать:

>>> str(inspect.signature(f).parameters['a'])
'a:int'

И затем обработать эту строку, используя .split и тому подобное.Но мне интересно, есть ли лучший способ.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Атрибут annotation каждого объекта параметра является объектом класса, поэтому вы можете просто использовать атрибут __name__ объекта класса, чтобы получить имя класса в виде строки:

import inspect

def f(a: int):
    pass

print(inspect.signature(f).parameters['a'].annotation.__name__)

Thisвыводит:

int

Но, как указал @chepner, атрибут annotation может быть строкой, если это прямая ссылка, поэтому, если вы хотите, чтобы ваш код был универсальным, вы должны принять это вучетная запись.Например:

class A:
    def f(self, a: 'A'):
        pass

annotation = inspect.signature(A.f).parameters['a'].annotation
print(annotation.__name__ if isinstance(annotation, type) else annotation)

Это выводит:

A
0 голосов
/ 07 февраля 2019

Используйте функцию annotations из модуля __future__.

>>> from __future__ import annotations
>>> def f(x:int): pass
...
>>> f.__annotations__
{'x': 'int'}

Это, однако, не было введено до Python 3.7.См. PEP-563 для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...