阻止Python在加载时加载脚本的某些部分

时间:2016-01-20 13:41:55

标签: python unit-testing nose

背景:我试图减少测试完成运行所需的时间。

我最近了解到,当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读取,立即执行此脚本然后尝试创建一个会话才能获得嘲笑方法。这需要几秒钟,我的测试随后需要更长时间才能完成运行(如果这不是流程,请纠正我)。

  • 有没有办法可以阻止Python在读取脚本时执行脚本(不将代码包装在函数中)?
  • 如果是这样,最常用的Pythonic方法是什么?
  • 此外,默认情况下,编写良好的测试需要多长时间才能运行。我认为这应该小于 1 秒(不知道我从哪里得到了这个印象)。

请分享一些见解,谢谢。

2 个答案:

答案 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()

在不知道这段代码应该做什么的情况下,无论是有什么东西都是类属性或实例属性更有意义。但是,你真的应该推迟所有“实际工作”,直到明确调用一个函数;导入模块时触发登录是疯狂的。