背景:我试图减少测试完成运行所需的时间。
我最近了解到,当Python解释器加载文件时,它会执行它在其中找到的所有代码。 (参考:https://stackoverflow.com/questions/419163/what-does-if-name-main-do)
有没有办法阻止解释器执行文件的某些部分?原因是,我有一个脚本创建一个会话并将其分配给一个类属性。脚本看起来像这样。
def login():
// Gets auth session from an api. This takes some seconds.
return // session
class Something(object):
class_session = login()
现在我试图模拟这个登录过程,但是当我运行我的单元测试时(我使用鼻子顺便说一句),我认为Python读取,立即执行此脚本然后尝试创建一个会话才能获得嘲笑方法。这需要几秒钟,我的测试随后需要更长时间才能完成运行(如果这不是流程,请纠正我)。
请分享一些见解,谢谢。
答案 0 :(得分:1)
要在导入文件时不要点击login()
,需要将其移出类属性空间。您可以通过将其置于如下方法中来完成此操作:
def login():
// Gets auth session from an api. This takes some seconds.
return // session
class Something(object):
class_session = None
def __init__(self):
if Something.class_session is None: # or self.__class__.class_session
Something.class_session = login()
Something.class_session = login()
需要在函数或方法中,以防止它在导入时运行。上面的方式,login()
将在第一次创建Something()
时执行。
有关导入模块时运行的内容的更多信息,请参阅answers here。
答案 1 :(得分:1)
您需要编写代码,以便在简单地声明内容时不会做太多。只有在显式调用函数或实例化类时,您的代码才能“实际工作”。
class Something(object):
class_session = login()
这会创建一个类属性class_session
,显然必须在定义类时发生,否则它不会是类属性。这需要在此时执行login()
。
要仅在实例化新对象时正确执行此操作,请将此代码移动到构造函数中并使其成为实例属性:
class Something(object):
def __init__(self):
self.class_session = login()
在不知道这段代码应该做什么的情况下,无论是有什么东西都是类属性或实例属性更有意义。但是,你真的应该推迟所有“实际工作”,直到明确调用一个函数;导入模块时触发登录是疯狂的。