问题描述
问题起因,某个项目通过 Cython 将代码打包后部署到测试服务器,某个函数报错:TypeError: test() tasks no keyword arguments
本地复现,准备一个简单的函数以及一个 setup.py
用于打包
├── __init__.py
├── setup.py
└── test.py
test.py
def test(uid):
print(uid)
if __name__ == "__main__":
test(uid=321)
setup.py
from distutils.core import setup
from Cython.Build import cythonize
setup(
ext_modules=cythonize('test.py',language_level=3,))
执行结果如下
问题解决
突然想起来有个 PEP 提到限制参数只能为位置参数,但我函数里并没有限制,不应该出现这种情况。
随后在群里寻求帮助,有个热心的老哥给了个链接:https://github.com/cython/cython/issues/2881
大致意思就是说,这是 Cython 对单参数函数的“优化”,如果想要避免这种情况,需要指定编译参数。
接下来按照 ISSUE 中提到的解决方案进行修改
# setup.py
from distutils.core import setup
from Cython.Build import cythonize
setup(
ext_modules=cythonize(
'test.py',
language_level=3,
compiler_directives={"always_allow_keywords": True}),
)
注意看第10行,这句话用来避免Cython对单参数函数的优化。
修改完之后,再次编译运行,结果如下
至此问题解决。
总结
你遇到的问题很可能别人也遇到过,千万不要闭门造车。在自己思考、搜索过后,仍不得其解的时候,勇敢地去问。
被帮助后不要吝啬自己的感谢,更重要的是不要忘记把这份善意传递下去:你的一句话就很可能帮别人节省一天的时间,何乐而不为呢?
参考资料
-
github.com/cython/cyth…
-
www.python.org/dev/peps/pe…
-
docs.cython.org/en/latest/s…
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!