资讯专栏INFORMATION COLUMN

cython之always_allow_keywords

wind5o / 3024人阅读

摘要:最近有个同事编译一个脚本后,脚本里面调用函数的地方出现了问题。这个报错的意思是,这个不支持参数,但是是支持这种特性的。特地去差了下文档,确实如此在这里只要开启选项,就可以解决问题。

TypeError

最近有个同事编译一个脚本后,脚本里面调用函数的地方出现了问题。
用一个简短的例子说明下:
py文件 a.py 内容如下:

def fn(a):
    print a

fn(a=4)   #出现问题在这一行

编译脚本build.sh如下:

cython -D -2 --embed a.py 
gcc -c -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing -I/usr/include/python2.7 -o a.o a.c
gcc -I/usr/include/python2.7 -o a a.o -lpython2.7

前面的a.py用python a.py执行是没有问题的,但是用cython编译成可执行文件后,执行就会出现如下错误:

Traceback (most recent call last):
  File "a.py", line 4, in init a
    fn(a=4)
TypeError: fn() takes no keyword arguments

也就是在 fn(a=4)的时候出现了问题。这个报错的意思是,这个fn不支持keyword参数,但是python是支持这种特性的。这不是冲突了?

always_allow_keywords

我上网找了一下,也有人碰到这个问题:https://github.com/bottlepy/b...
这里有人指出:

This is actually an incorrect assertion, and there is a quite simply fix.

By default, Cython compiles functions with 0 or 1 arguments, as special PyCFunction METH_O or METH_NOARGS. This functions do not accept keyword arguments.

You can tell Cython to disable this optimization by changing the always_allow_keywords compiler directive to True (you can do it per function, per file or globally, check cython"s documentation on how to do it).

This issue happens actually in all web frameworks who use tricks like this.

cython编译器默认情况下会做一下优化:对于没有参数或只有一个参数的函数,会禁止keyword参数。

特地去差了下cython文档,确实如此:

always_allow_keywords (True / False)
Avoid the METH_NOARGS and METH_O when constructing functions/methods which take zero or one arguments. Has no effect on special methods and functions with more than one argument. The METH_NOARGS and METH_O signatures provide faster calling conventions but disallow the use of keywords.

在这里只要开启always_allow_keywords选项,就可以解决问题。所以我在前面build.sh里对cython 加了一个参数,效果如下:

cython -D -2 --directive always_allow_keywords=true --embed a.py

也就是增加了 --directive always_allow_keywords=true,也就解决了问题。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41939.html

相关文章

  • 在 Mac 下使用 Cython

    摘要:摘要在下使用会碰到一些意外。本文就此简单举了一个例子来说明在中使用的正确姿势。运行之接下来,我们来运行这个函数,当然是使用的方法。结束至此步骤全部完成本文只是给出了一些在上使用可能碰到的一些问题的解决方法。 摘要:在 Mac 下使用 Cython 会碰到一些意外。例如链接命令不一样什么的。本文就此简单举了一个例子来说明在 Mac OS X 中使用 Cython 的正确姿势。 安装 Cy...

    huangjinnan 评论0 收藏0
  • Cython 3.0 中文文档校对活动 | ApacheCN

    摘要:整体进度贡献指南项目仓库贡献指南请您勇敢地去翻译和改进翻译。然后回复,注明章节号一定要留。二校对需要校对语法术语使用文档格式如果觉得现有翻译不好,重新翻译也是可以的。三提交项目将译文放在文件夹下请见入门指南。 整体进度:https://github.com/apachecn/c... 贡献指南:https://github.com/apachecn/c... 项目仓库:https://...

    iamyoung001 评论0 收藏0
  • 4 个快速的 Python 编译器 for 2018

    摘要:但是由于程序并没有那么快,开发人员多年来创建了几个的编译器,包括和。在下面的细分中,所有的编译器都针对进行基准测试。编译器是系列的一部分,旨在作为的现代替代品。不仅仅是的编译器,它是的超集,支持与的互操作性。 简评:Python 和其他的解释型语言一样经常被吐槽性能不行,所以开发人员为了提升性能创建了不少编译器,本文则选取其中的四个做了基准测试。 Python 其实是一种相当快的语言,...

    YancyYe 评论0 收藏0
  • 为你的Python程序加密

    摘要:在实际的工作中,有时候我们需要部署自己的应用,但这时候我们并不希望别人能够看到自己的源程序。因此,我们需要为自己的源代码进行加密,已经为我们提供了这样一套工作机制。本文以系统为例,讲解如何将自己的程序文件加密为文件。   在实际的工作中,有时候我们需要部署自己的Python应用,但这时候我们并不希望别人能够看到自己的Python源程序。因此,我们需要为自己的源代码进行加密,Python...

    Terry_Tai 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<