如何获取函数的参数类型和返回类型?

时间:2013-03-04 11:03:53

标签: python types genetic-programming

我试图在python中实现强类型遗传编程。

有类似这样的样品吗?

def funcA(a,b):
  return a + b
return_type(funcA)

output: <class 'Integer'>

def funcA(a,b):
  return a + b
parameter_type(funcA)

output: [<class 'Integer'>,<class 'Integer'>]

更新

我试图生成python的表达式并避免某些事情无法像这样评估:

funcA(20, funcA(True, "text"))

7 个答案:

答案 0 :(得分:6)

Python 3引入了函数注释。他们自己不做任何事情,但你可以写自己的执法:

def strict(fun):
    # inspect annotations and check types on call

@strict
def funcA(a: int, b: int) -> int:
    return a + b 

答案 1 :(得分:2)

最好的方法是使用docstrings来存储函数的这些信息和

In [49]: def funcA(a,b):
   ....:     ''' returns an int '''
   ....:     return int(a+b)
   ....:

In [50]: funcA.__doc__
Out[50]: ' returns an int '

答案 2 :(得分:2)

在Python中,在执行调用并执行return语句之前,不知道返回类型。它甚至可以在不同情况下有所不同,因此简短的回答是“不可能”。

如果您需要知道某个函数的返回类型,您仍然可以将其包装到某些类型检查代码中,该代码也可能会公开返回类型。然而,这将是相当不合理的:

def declare_return_type(t):
    def decorator(f):
        def wrapper(*a, **kw):
            res = f(*a, **kw)
            assert isinstance(res, t)
            return res
        wrapper.return_type = t
        return wrapper
    return decorator

@declare_return_type(int)
def f(a, b):
    return a + b

print f.return_type

print f(1, 2) # ok
f('a', 'b') # Assertion error

UPD:您可以对参数类型执行相同操作并检查它们。

答案 3 :(得分:2)

在Python中,一种动态且强类型的语言,在运行时需要函数的类型信息。在3.3及更高版本中,您可以按如下方式获取函数的类型:

from inspect import signature
def foo(a, *, b:int, **kwargs):
...     pass

sig = signature(foo)

str(sig)
'(a, *, b:int, **kwargs)'

str(sig.parameters['b'])
'b:int'

sig.parameters['b'].annotation
<class 'int'>

请参阅https://docs.python.org/3/library/inspect.html#introspecting-callables-with-the-signature-object

答案 4 :(得分:2)

您可以使用注释进行检查:

>>> def func(a: str) -> int:
       # code
>>> func.__annotations__["return"]
<class 'int'>

与参数相同:

>>> func.__annotations__["a"]
<class 'str'>

答案 5 :(得分:0)

没有机会。因为python使用duck typing,你可以传递不同类型的参数,例如int和int,str和str等到funcA。如果没有看到实际参数,就没有机会告诉返回类型和参数类型

答案 6 :(得分:0)

这是不可能的 - 你自己的例子证明了这一点,想象你这样称呼它:

funcA(1, 2)

你得到3,一个整数,但是这个:

funcA("Test", "Test")

你得到"TestTest",一个字符串! Python不关心类型,也不保证输出单一类型的函数。这也会因float s或list s而产生不同的结果。除此之外,您还可以显式返回不同类型的对象。

总的来说,这是一件好事。这意味着您不必担心类型是否正确,只需要考虑是否可以使用您传入的内容。这使得Python非常灵活。