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

Prevent Python from loading certain parts of a script when it gets loaded

背景:我正在努力减少完成测试所需的时间运行ning。

我最近了解到,当 Python 解释器加载文件时,它会执行它在其中找到的所有代码。 (参考:)

有没有办法阻止解释器执行文件的某些部分?原因是,我有一个创建会话并将其分配给 class 属性的脚本。脚本看起来像这样。

 def login():
     // Gets auth session from an api. This takes some seconds.
     return // session

 class Something(object):
     class_session = login()

现在我试图模拟这个登录过程,但是当我 运行 我的单元测试(顺便说一句,我正在使用 nose)时,我想 Python 读取,立即执行这个脚本然后尝试在模拟该方法之前创建一个会话。这需要几秒钟,我的测试随后需要更长时间才能完成 运行ning(如果这不是流程,请纠正我)。

请分享一些见解,谢谢。

为了防止 login() 在导入文件时被命中,需要将其移出 class 属性 space。您可以通过将其放在如下方法中来执行此操作:

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

您需要以这样一种方式编写代码,即它不会在简单地声明事物时做太多事情。仅当您显式调用函数或实例化 class 时,您的代码才应执行 "actual work".

class Something(object):
    class_session = login()

这会创建一个 class 属性 class_session,这显然必须在定义 class 时发生,否则它不会是 class 属性。这就需要此时执行login()

要仅在实例化新对象时正确执行此操作,请将此代码移至构造函数中并使其成为实例 属性:

class Something(object):
    def __init__(self):
        self.class_session = login()

在不知道这段代码应该做什么的情况下,不可能说让某物成为 class 属性 或实例 属性 更有意义。但是,您确实应该延迟所有 "real work" 直到显式调用函数;在导入模块时触发登录是疯狂的。