Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
防止Python在加载脚本时加载脚本的某些部分_Python_Unit Testing_Nose - Fatal编程技术网

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

防止Python在加载脚本时加载脚本的某些部分,python,unit-testing,nose,Python,Unit Testing,Nose,背景:我正在努力减少完成测试所需的时间 我最近了解到,当Python解释器加载一个文件时,它会执行在其中找到的所有代码。(参考号:) 有没有办法防止解释器执行文件的某些部分?原因是,我有一个脚本,它创建一个会话并将其分配给一个类属性。脚本看起来像这样 def login(): // Gets auth session from an api. This takes some seconds. return // session class Something(objec

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

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

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

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

 class Something(object):
     class_session = login()
现在我尝试模拟这个登录过程,但是当我运行单元测试(我使用的是nose-btw)时,我认为Python读取、立即执行这个脚本,然后在模拟方法之前尝试创建一个会话。这需要几秒钟,我的测试随后需要更长的时间才能完成运行(如果这不是流程,请纠正我)

  • 有没有一种方法可以防止Python在读取脚本时执行脚本(而不将代码包装到函数中)
  • 如果是这样的话,什么是处理这个问题的最好的方法
  • 另外,默认情况下,一个编写良好的测试需要多长时间才能运行。我认为这应该少于1秒(不确定我从tho那里得到的印象)
请分享一些见解,谢谢。

要防止导入文件时命中
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\u session=login()
需要在函数或方法中,以防止在导入时运行它。按照上面写的方式,
login()
将在第一次创建
Something()
时执行


有关导入模块时运行什么的更多信息,请参阅。

您需要以这样一种方式编写代码,即在简单地声明内容时,代码不会做太多工作。只有在显式调用函数或实例化类时,代码才应执行“实际工作”

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

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

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

如果不知道这段代码应该做什么,就很难说将某个对象设置为类属性还是实例属性更有意义。然而,您确实应该延迟所有“实际工作”,直到显式调用一个函数;导入模块时触发登录是疯狂的。

从bla import foo?@Alex开始,它仍然会加载整个脚本。如果
class\u session
是一个类属性,那么您可以将其初始化为
None
并将
Something.class\u session=login()
移动到一个方法(甚至
\u init\u
)避免在对象第一次被命中时调用它。与其拥有全局数据,不如传递它。
class Something(object):
    def __init__(self):
        self.class_session = login()