将函数捆绑到单个IPython笔记本

时间:2016-04-09 02:03:49

标签: module ipython python-decorators jupyter-notebook ipython-magic

如果您正在编写一个传统的Python程序,将多个函数放在一个单独的函数包中以将其作为bundle_name.function_name()访问它们的最自然的方法是找到它们是一个单独的文件并将其导入为每次需要时都会模块化。

当你开始使用IPython笔记本时,事情变得越来越复杂,因为你基本上只在一个IPython会话中工作,并且没有一个明确的解决方案可以解决将复杂应用程序的逻辑分成几个模块的问题(在功能层面上) , 至少)。我想到的很少:

  1. 为每个函数定义类并使用@staticmethod或使用类装饰器:
  2. 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. 每次都写入文件并重新导入
    2. 小区1:

      %%writefile test_module_tmp.py
      
      def func1(a, b):
          return a+b+3
      

      小区2:

      %load_ext autoreload
      %autoreload 1
      %aimport test_module_tmp
      

      CELL3:

      test_module_tmp.func1(10, 20)
      

      - 最重要的是你可以重复使用其他笔记本中的那些util-functions +你不是'重新发明'其他人难以理解的自定义装饰器。

      主要缺点是您使用需要按特定顺序调用的多个单元格才能正常工作,每次重新启动会话时,都需要重新执行这些“重新加载定义”等。你也不能在那些单元格的底部写'test()'函数,以便它们被执行,并且每当你改变并重新运行它们时,它们的输出将被重定向到单元格下面的单元格输出中(所以你可以看到在你按下这个模块单元格中的Ctr + Enter之后,如果有问题,就像def func1(): ..; def test_func1():..; test_func1()一样 - 并在一个批次中运行它。“

      我想知道这个问题是否有任何可靠的开箱即用解决方案?

0 个答案:

没有答案