bpython -i&命名空间

时间:2011-08-28 20:46:10

标签: python namespaces ipython interactive bpython

我似乎无法在任何地方找到这个答案。

给出了一个简单的例子:

# 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确实存在 - 主函数本身也是如此。

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

3 个答案:

答案 0 :(得分:1)

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

my_class_instance = None

def main():
    global my_class_instance

    my_class_instance = MyClass()

答案 1 :(得分:0)

当我想要运行主函数时,我有时会使用的另一个技巧是在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。

答案 2 :(得分:0)

在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()