【Py】cython编译后解释器会对某些类型进行类型检查
Python从3.5版本开始支持type hints# type_hint.pydef foo(a: str) -> str:print(a)def bar(b) -> str:print(b)return 0但并不会强制进行检查,也就是说类型不一致并没有什么发生但是使用cython编译后,一切就会不一样# setup.pyfrom distutils.core import setu
·
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

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)