【发布时间】:2017-12-11 22:55:35
【问题描述】:
我想包含一个文件中的代码以在另一个文件中使用,就像导入一个模块一样,但我不想编译第一个文件来这样做。
我的项目管道如下所示:
文件A这样定义扩展类型对象:
cdef class Thing(object):
...
这种文件会有很多不同的版本,每个版本都定义了一个名为“Thing”的类。
文件 B 使用类“Thing”完成所有类型的整洁工作,但没有在文件 B 中定义它,因为文件 B 能够对文件 A 中定义的许多不同类型的称为“事物”的对象执行一般操作。
例如
cdef int do_cool_stuff(Thing a, Thing b):
...
基本上。我可以将文件 B 中的代码复制粘贴到每个文件 A 中,它都会正常工作。但我想更好地组织我的项目,这两种类型的文件执行非常不同的任务,我希望混合和匹配这些任务。
有什么建议吗?
另外,如果能做这样的事情就好了:
在文件 A 中:
ctypedef ... newtype
在文件 B 中:
cdef newtype...
如果有帮助,newtype 将与 double 非常相似,但可能携带更多信息。我将重载比较运算符 、== 等,但我希望 newtype 携带比双精度更多的信息。
编辑:我将添加更多信息,因为似乎大多数读者都觉得这个问题比它更琐碎。
我有几个很长的程序,文件都可以分成两个不同的部分,每个部分的后半部分在代码方面都是相同的,但它们都使用在第一部分中定义的类型。第二部分不能独立存在,因为它依赖于第一部分中的 ctypedef 语句。
所以我想要的是: 文件1:
cdef class Thing:...
文件2:
stuff(Thing one, Thing two)
文件3:
import file1
import file2
并编译 file3,文件 1 和 2 未编译。
如果我制作 file1 和 file2 .pxd 文件并使用 cimport,我会收到有关 def 不允许使用的投诉以及所有 cdef 语句必须内联的投诉。如果我将 import 与 .py 文件一起使用,编译器会抱怨 file1 不是 cimported 模块。
为什么 cython 坚持以比我的主文件更严格的方式格式化我的头文件?我本质上想避免将 file2 复制粘贴到我的主文件中,最好编写一次并导入它,但我似乎无法找到任何可以帮助我完成此操作的文档。
【问题讨论】:
-
我不同意,如果没有文件 A 中的信息,我无法编译文件 B,我想做的是:写入文件 A 和 B,将它们导入文件 C 和编译。听起来像是一项简单的任务,但我所做的一切都不起作用。
-
我对问题进行了编辑,以更具体地说明为什么文档没有解释在我的情况下该怎么做。
-
我有一个似乎在任何地方都没有得到回答的问题是:在 C 中,有一些头文件不需要在被包含到更广泛的项目之前进行编译。是否有 Cython 等价物?如果我的 pyx 文件在不包含其他头文件的情况下无法自行编译,我可以像在 C 中那样将它们导入另一个项目吗?
-
听起来你想要的只是一个文本包含 cython.readthedocs.io/en/latest/src/userguide/… - 这不是真的推荐(这是一种旧的做事方式)但它可能适合你的使用