【问题标题】:Functions defined in Cython .pyx become built-in?Cython .pyx 中定义的函数成为内置函数?
【发布时间】:2017-09-29 17:50:13
【问题描述】:

我在玩 cython 教程 (http://docs.cython.org/en/latest/src/tutorial/cython_tutorial.html)

我有一个这样的目录:

somedir/ExampleCython.py
somedir/fib.pyx
somedir/fib.so
somedir/function_file.py
somedir/setup.py

fib.pyx 定义了上面链接的 cython 教程中的函数 fib,function_file.py 包含以下定义:

def moopy(param):
    param += 1
    return param

ExampleCython.py 包含以下内容:

import fib as moo

print moo.fib

from function_file import moopy

print moopy

我使用 python setup.py build_ext --inplace 构建 fib.so,然后运行 ​​python ExampleCython.py 并得到以下输出:

<built-in function fib>
<function moopy at 0x1002b4398>

现在,我知道没有名为 fib 的内置 python,为了测试,我尝试将名称“fib”更改为类似“poopypants”的愚蠢名称,但它仍然说它是内置的。 fib 函数的命名空间发生了什么变化?我在其他地方的一个更大的代码块中遇到了这个问题,这阻止了我对我创建的类进行腌制——pickle 抱怨它在它所属的模块中找不到我的函数——但我想我会简化它在这里提问。

供参考 - OSX 10.12.6 上的 python 2.7.11/cython 0.26

【问题讨论】:

  • "built-in" 具有误导性——它只是意味着它是在 C 库中实现的函数(正如您对 Cython 所期望的那样)。您可能最好创建一个 minimal reproducible example 来说明您的泡菜问题(这似乎是您真正想要解决的问题)
  • 好的,那我该怎么回答这个问题呢?使用更新的示例对其进行编辑,或者关闭它或将其标记为已回答或其他什么?
  • 我会编辑这个问题。由于没有人回答它,我认为对其进行相当大的编辑不是问题。 (不过您的选择 - 两种选择都是合理的!)
  • 我实际上基于此解决了我的泡菜问题:stackoverflow.com/questions/18503466/… 虽然在我看来,我的问题的答案就像你说的'内置是误导',但对象仍然有例如,正确的 '____module____' 属性。我可以以某种方式将您的评论标记为已接受的答案吗?

标签: python namespaces cython pickle


【解决方案1】:

这已在评论中解决,但作为完整性的答案发布:

Python 将这些函数描述为“内置函数”纯粹是为了表示它是用 C 编译的,而不是表示它是标准库函数,因此存在问题 - 在正确的模块。

在我的电脑上,它显示为&lt;cyfunction module.function_name at 0xsome_address&gt;,这是一条更有帮助的消息。我认为这可能是 Python 3 的改进(但我不是 100% 确定)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-04
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多