我有一个类似于以下的目录结构
meta_project
project1
__init__.py
lib
module.py
__init__.py
notebook_folder
notebook.jpynb
Run Code Online (Sandbox Code Playgroud)
当notebook.jpynb我尝试使用相对导入来访问函数function()时module.py使用:
from ..project1.lib.module import function
Run Code Online (Sandbox Code Playgroud)
我收到以下错误
SystemError Traceback (most recent call last)
<ipython-input-7-6393744d93ab> in <module>()
----> 1 from ..project1.lib.module import function
SystemError: Parent module '' not loaded, cannot perform relative import
Run Code Online (Sandbox Code Playgroud)
有没有办法让这个使用相对导入工作?
请注意,笔记本服务器在meta_project目录级别实例化,因此它应该可以访问这些文件中的信息.
另请注意,至少与最初的预期project1并未被视为模块,因此没有__init__.py文件,它只是作为文件系统目录.如果问题的解决方案需要将其视为一个模块并包含一个__init__.py文件(即使是空白文件),那么这样做是不错的,但这样做不足以解决问题.
我在机器和相对导入之间共享这个目录允许我在任何地方使用相同的代码,并且我经常使用笔记本进行快速原型设计,因此涉及黑客攻击绝对路径的建议不太可能有用.
编辑:这与Python 3中的相对导入不同,Python 3通常讨论Python 3中的相对导入,特别是从包目录中运行脚本.这与在jupyter笔记本中工作有关,该笔记本试图在另一个具有不同的一般和特定方面的目录中的本地模块中调用函数.
为了提高内存效率,我一直在努力将我的一些代码从列表转换为生成器/迭代器。我发现了很多案例,我只是将我制作的列表转换为np.array带有代码模式的列表np.array(some_list)。
值得注意的是,some_list通常是一个迭代生成器的列表推导式。
我正在研究np.fromiter是否可以更直接地使用生成器(而不是首先将其转换为列表然后将其转换为 numpy 数组),但我注意到该np.fromiter函数与使用的任何其他数组创建例程不同现有数据需要指定dtype.
在我的大多数特定情况下,我可以完成这项工作(主要是处理对数似然,所以 float64 会很好),但它让我想知道为什么这只是fromiter数组创建者而不是其他数组创建者所必需的。
我的理解是,如果您知道dtype和count,它允许为结果预分配内存np.array,并且如果您不指定可选count参数,它将“按需调整输出数组的大小”。但是,如果您不指定计数,似乎您应该能够dtype像在正常np.array调用中一样即时推断出。
我可以看到这对于将数据重新转换为 new 很有用dtype,但这也适用于其他数组创建例程,并且似乎值得将其放置为可选但不是必需的参数。
那么为什么您需要指定dtype要使用的np.fromiter;或者换句话说,指定dtype数组是否要按需调整大小会带来什么好处?
与我的问题更直接相关的同一问题的更微妙版本:我知道np.ndarray当您不断调整 s 的大小时,它们的许多效率收益都会丢失,那么使用np.fromiter(generator,dtype=d)over np.fromiter([gen_elem for gen_elem in generator],dtype=d)over 有np.array([gen_elem for gen_elem in generator],dtype=d)什么好处?