【问题标题】:bpython -i & namespacesbpython -i & 命名空间
【发布时间】:2011-08-28 20:46:09
【问题描述】:

我似乎在任何地方都找不到这个答案。

举个简单的例子:

# myclass.py
class MyClass:
    def __init__(self):
        print 'test'

def main():
    my_class_instance = MyClass()

if __name__ == '__main__':
    main()

some_var = 'i exist!  ... but I think I'm in global namespace?'

如果我运行 bpython -i myclass.py,我会执行程序并进入 bpython 环境。无论我在哪个名称空间中 - my_class_instance 都不存在。但是, some_var 确实存在 - main 函数本身也是如此。

当我进入该交互式提示时,我是否可以将该主函数中存在的任何对象拉入我所在的命名空间?或者还有什么我应该做的吗?

【问题讨论】:

    标签: python namespaces ipython interactive bpython


    【解决方案1】:

    my_class_instance 位于main 的命名空间中,因此您无法在main 之外看到它。改用全局变量:

    my_class_instance = None
    
    def main():
        global my_class_instance
    
        my_class_instance = MyClass()
    

    【讨论】:

      【解决方案2】:

      当我想从运行 main 函数中返回一些东西时,我有时会使用的另一个技巧是在 main 结束时返回我需要的东西。

      因此,例如,如果我需要顶层主函数中的一个实例和一些其他变量,可以这样做:

      def main():
          myclass = MyClass()
          a = 4
          return (my class, a)
      
      if __name__ == '__main__':
          ret = main()
      

      如果您现在使用 bpython -i scriptname 调用您的脚本,您将在全局命名空间中拥有变量“ret”,并且 ret[0] 拥有您的类实例,ret[1] 拥有数字 4。

      【讨论】:

        【解决方案3】:

        在 python 2.7 上使用交互式 bpython,__name__ 等于 __console__。所以你的函数main() 可能永远不会被调用。一个技巧是写:

        # myclass.py
        class MyClass:
            def __init__(self):
                print 'test'
        
        def main():
            global my_class_instance
            my_class_instance = MyClass()
        
        if __name__ in ('__main__', '__console__'):
            main()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-07-18
          • 2010-10-20
          • 1970-01-01
          • 1970-01-01
          • 2016-05-24
          • 2010-12-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多