如何在Python中打印函数的类型注释?

时间:2019-07-19 09:58:34

标签: python python-3.x

因此,假设我使用类型注释定义了以下函数:

1-coordinate

有没有办法显示此函数的带注释类型?也许是函数from typing import List def my_function(input_1: str, input_2: int) -> List[int]: pass 或类似的东西?这样就可以像这样使用它:

types_of

3 个答案:

答案 0 :(得分:6)

您可以使用__annotations__

from typing import List
def my_function(input_1: str, input_2: int) -> List[int]:
    pass


In [2]: my_function.__annotations__
Out[2]: {'input_1': str, 'input_2': int, 'return': typing.List[int]}

或者您可以使用get_type_hints模块中的typing功能。实际上,我认为这是更合适的解决方案

根据docs get_type_hints返回包含功能,方法,模块或类对象的类型提示的字典。

功能示例:

from typing import get_type_hints, List

def my_function(input_1: str, input_2: int) -> List[int]:
    pass

In [2]: get_type_hints(my_function)
Out[2]: {'input_1': str, 'input_2': int, 'return': typing.List[int]}

课程示例:

对于类,get_type_hints返回一个字典,该字典是通过将__annotations__Foo.__mro__中的所有class Bar: BAR_C: bool = True class Foo(Bar): FOO_STR: str = 'foo' FOO_INT: int = 42 def __init__(a: str, b: int) -> None: self._a = a self._b = b def some_method(self, foo: List, bar: bool) -> bool: pass In [7]: get_type_hints(Foo) Out[7]: {'BAR_C': bool, 'FOO_STR': str, 'FOO_INT': int} Out[8]: get_type_hints(Foo.__init__) Out[8]: {'a': str, 'b': int, 'return': NoneType} In [9]: get_type_hints(Foo.some_method) Out[9]: {'foo': typing.List, 'bar': bool, 'return': bool} 以相反的顺序合并而成的。

test_module.py

模块示例

我们的模块from typing import Dict SOME_CONSTANT: Dict[str, str] = { '1': 1, '2': 2 } class A: b: str = 'b' c: int = 'c' def main() -> None: pass if __name__ == '__main__': main()

In [1]: from typing import get_type_hints
In [2]: import test_module

In [3]: get_type_hints(test_module)
Out[3]: {'SOME_CONSTANT': typing.Dict[str, str]}

In [4]: get_type_hints(test_module.A)
Out[4]: {'b': str, 'c': int}

In [5]: get_type_hints(test_module.main)
Out[5]: {'return': NoneType}

然后打开python shell:

div {
  width: 778px;
  height: 100px;
  background: radial-gradient(ellipse at top center, green, yellow 229px);
  background-size: 100% 100%;
  background-position: 0% 0%;
}

答案 1 :(得分:2)

您可以使用f模块:

inspect

输出:

import inspect
from typing import List

def my_function(input_1: str, input_2: int) -> List[int]:
    pass

def types_of(func):
    specs = inspect.getfullargspec(func)
    return_type = specs.annotations['return']
    input_types = [t.__name__ for s, t in specs.annotations.items() if s != 'return']
    return f'[{", ".join(input_types)}] -> {return_type}'

types_of(my_function)

答案 2 :(得分:1)

您可以使用inspect

import inspect

def sum_numbers(first_number=4,second_number=5):
    return a+b


def print_argtypes(function):
    specs = inspect.getfullargspec(sum_numbers)
    for s in range(len(specs[0])):
        print(specs[0][s]+': '+str(type(specs[3][s])))

print_argtypes(sum_numbers)

输出

first_number: <class 'int'>
second_number: <class 'int'>