Python从3.5版本开始支持type hints
# type_hint.py
def foo(a: str) -> str:
print(a)
def bar(b) -> str:
print(b)
return 0
但并不会强制进行检查,也就是说类型不一致并没有什么发生
但是使用cython编译后,一切就会不一样
# setup.py
from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules=cythonize('./type_hint.py', compiler_directives={'always_allow_keywords': True}))
>>> python3 setup.py build_ext --inplace
再对编译后的.so文件进行调用
>>> import type_hint
>>> type_hint.foo(123)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-2-34d9c4e717cc> in <module>
----> 1 type_hint.foo(123)
TypeError: Argument 'a' has incorrect type (expected str, got int)
>>> import type_hint
>>> type_hint.bar('a')
a
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-4-e8fb7c0cdcb3> in <module>
----> 1 type_hint.bar('a')
~/Git/test/cython_test/type_hint.cpython-38-darwin.so in type_hint.bar()
TypeError: Expected str, got int
如果参数类型或返回类型与声明的不一致则会报错
注意:并不是所有的类型都会进行类型检查
typehint | input | TypeError? |
---|---|---|
int | str | n |
int | list | n |
str | int | y |
float | str | y |
float | bool | n |
dict | str | y |
set | str | y |
set | dict | y |
list | str | y |
bool | str | n |
参考:https://github.com/cython/cython/issues/3130#issue-489331603