防止Python在加载脚本时加载脚本的某些部分
背景:我正在努力减少完成测试所需的时间 我最近了解到,当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
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()