【发布时间】: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