2016-07-28 76 views
0

我正在编写一个程序,它从不同的服务请求用户信息,并以某种方式将它们放在一起。管理的东西,并做一些松散的互动。 我所有的python项目都会在特定的大小时出现问题。导入开始变为递归,处理周围的数据变得烦人。Python类,数据结构和适当的体系结构

我刚刚遇到的一个问题的一个简单例子就可以用这个简单的例子来展示。我有一个主要模块(这里是A)创建主要对象(单身人士)。 这些对象需要互相调用函数,所以我使用main作为连接器。在这个给定的例子中,我不明白B何时创建它从A请求的列表是(None)NoneType。吸气剂功能不一定是我的方式,但它有助于另一种情况。你有没有什么提示,指出如何构建中型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! 

回答

3

你有现在的主要模块的副本,每个副本中sys.modules一个单独的条目:

  1. 最初的Python脚本,从开始命令行始终称为__main__

  2. 您导入了A.py文件作为A模块。这是单独__main__模块。

是的,相同的源文件提供了两个模块,但Python认为它们是不同的。

因此,该第二个副本没有执行if __name__ == '__main__':块,因为__name__变量被设置为'A'。因此,A.some_listA.b仍然设置为None;您需要__main__.some_list__main__.b

请不要将代码放在其他模块需要导入才能访问的主入口点。 传递这样的依赖关系,或让它们由主模块和其他模块可以导入的单独模块管理。

你可以,例如,通过在功能上与B()类:

b = B.B(get_list) 
+0

MMH不知道,如果它是一个版本的东西(2.7.11),但我不能用'__main__'为:' NameError:全局名称'__main__'未定义.. – ramin

+0

@ramin:这不是Python版本的东西。你没有导入'__main__'。 –

+0

即使是pycharm抱怨没有找到__main __导入它的作品 - 固定地图后fct:D谢谢! – ramin