我试图在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"))
答案 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)
答案 6 :(得分:0)
这是不可能的 - 你自己的例子证明了这一点,想象你这样称呼它:
funcA(1, 2)
你得到3
,一个整数,但是这个:
funcA("Test", "Test")
你得到"TestTest"
,一个字符串! Python不关心类型,也不保证输出单一类型的函数。这也会因float
s或list
s而产生不同的结果。除此之外,您还可以显式返回不同类型的对象。
总的来说,这是一件好事。这意味着您不必担心类型是否正确,只需要考虑是否可以使用您传入的内容。这使得Python非常灵活。