如果您正在编写一个传统的 Python 程序,那么将多个函数放在一个函数包中以按原样访问它们的最自然方法bundle_name.function_name()
是找到它们,并在每次需要它们时将其作为模块导入。
当您开始使用 IPython notebook 时,事情变得越来越复杂,因为您基本上是在一个 IPython 会话中工作,并且对于将复杂应用程序的逻辑拆分为多个模块的问题没有一个明确的解决方案(至少在功能级别上,至少)。这些是我想到的几个:
- 定义类并
@staticmethod
为每个函数使用或使用类装饰器:
.
import inspect
def act_as_module(cls):
for name, func in inspect.getmembers(cls, predicate=inspect.ismethod):
setattr(cls, name, staticmethod(cls.__dict__[name]))
return cls
@act_as_module
class NiceClass:
def func1(a, b):
return a+b
- 每次写入文件并重新导入
单元格1:
%%writefile test_module_tmp.py
def func1(a, b):
return a+b+3
单元格2:
%load_ext autoreload
%autoreload 1
%aimport test_module_tmp
单元格3:
test_module_tmp.func1(10, 20)
- 好的部分是您可以重新使用其他笔记本中的那些实用程序功能+您没有“重新发明”其他人可能难以理解的自定义装饰器。
主要缺点是您使用需要按特定顺序调用的多个单元格才能正常工作,并且每次重新启动会话时,都需要重新执行那些“重新加载定义”等等。而且您还可以'不要在这些单元格的底部写'test()'函数来执行它们,并且每次更改并重新运行它时,它们的输出将被重定向到单元格下方的单元格输出中(这样你'在你按 Ctr+Enter 在这个模块单元内,我会看看是否有什么东西坏了,比如def func1(): ..; def test_func1():..; test_func1()
- 并在一个批次中运行它)。
我想知道这个问题是否有任何可靠的开箱即用解决方案?