我正在编写一个程序,它从不同的服务中请求用户信息,并以某种方式将它们组合在一起。管理东西并做一些松弛的互动。 我所有的python项目都有一定的问题。导入开始变得递归并且处理数据变得烦人。
我刚刚遇到的一个问题的简单示例可以通过这个简单的例子来展示。我有一个主模块(这里是A),它创建了主要对象(单例)。 这些对象需要相互调用函数,因此我使用main作为连接器。在这个给定的例子中,我不明白何时创建B,它从A请求的列表是(None)NoneType。 getter函数不一定是我的方式,但它在另一种情况下有所帮助。你有任何提示,读到点,如何构建中型python程序。谢谢!
import B
some_list = None
b = None
def get_list():
return some_list
if __name__ == "__main__":
some_list = [1,2,3]
b = B.B()
print b.my_list
模块B
from A import get_list
class B:
def __init__(self):
self.my_list = get_list().map(lambda v : v * 2) # CRASH HERE!
答案 0 :(得分:3)
您现在拥有主模块的两个副本,每个副本都是sys.modules
中的单独条目:
从命令行开始的初始Python脚本始终称为__main__
。
您将A.py
文件导入为A
模块。这与__main__
模块分开。
是的,相同的源文件提供了两个模块,但Python认为它们是不同的。
因此,第二个副本没有执行if __name__ == '__main__':
块,因为__name__
变量设置为'A'
。因此,A.some_list
和A.b
仍设置为None
;您想要__main__.some_list
和__main__.b
。
不要将代码放在主要入口点,其他模块需要导入才能访问。 传递此类依赖项,或者让它们由主模块和其他模块都可以导入的单独模块管理。
例如,您可以将函数传递给B()
类:
b = B.B(get_list)