2013-03-04 152 views
1

我试图在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")) 
+1

请使用您正在尝试解决的_exact问题更新您的问题,因为您认为这是解决方案_,因为在像Python这样的松散类型的语言中,这种范例没有意义。如果你绕过自己的目标,你就可以做到这一点,但我又想知道这种要求的智慧。 – 2013-03-04 11:05:58

回答

4

的Python 3引入了功能注释。就其本身而言,他们没有做任何事情,但你可以编写自己的执法:

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

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

同样值得注意的是类型检查通常是一个糟糕的主意。它使你的功能变得不那么有用,而且一般来说,并不能真正帮助你。在一些非常具体的情况下,它可能是有用的,但不应该作为理所当然的事情 - 如果你需要这样做,可以写Java代替。 – 2013-03-04 11:12:29

+0

但是这对我的问题是一个好主意:D 很高兴看到python可以是强类型,严格类型和动态的。 – snow 2013-03-04 11:45:43

+3

不幸的是,在编译类型时没有执行检查,由于语言的性质,没有任何检查。我不会说它看起来像一个经典的“强类型”。当然,你可以进行任何你想要的类型检查。但只在执行时。 – Ellioh 2013-03-04 11:53:58

0

没有机会。由于python使用鸭子打字,你可以传递不同类型的参数,例如int和int,str和str等来funcA。有没有机会告诉什么返回类型和参数类型可以是没有看到实际的参数

2

最好的方法是使用文档字符串存储功能等信息,并

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

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

+1对于docstring,虽然要公平,你应该有'return int(a + b)'。 – 2013-03-04 11:09:02

+0

感谢更新:) – avasal 2013-03-04 11:09:38

+0

值得注意的是,强制东西是某些类型的东西在Python中是一个坏主意,因为它会让你的函数变得不那么有用。 – 2013-03-04 11:10:01

0

这是不可能的 - 你自己的例子证明了这一点,想像你这样调用它:

funcA(1, 2) 

你得到3,整数,但对于这一点:

funcA("Test", "Test") 

你得到"TestTest",串! Python不关心类型,没有函数保证输出单一类型。这也会产生与floatlist不同的结果。除此之外,您还可以显式返回不同类型的对象。

一般来说,这是一件好事。这意味着您不必担心该类型是否正确,只是可能处理您传递的内容。这使得Python非常灵活。

1

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

如果您需要知道特定函数的返回类型,您仍然可以将其包装为某种类型的检查代码,该代码也可能会显示返回类型。然而,这将是相当unpythonic:

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:可以在同一做参数类型,并检查他们。