【问题标题】: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()