防止 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(如果这不是流程,请纠正我)。
- 有什么方法可以防止 Python 在读取脚本时执行脚本(无需将代码包装在函数中)?
- 如果是,最Python处理这个问题的方法是什么?
- 此外,一个写得很好的测试默认需要多长时间才能达到 运行。我认为这应该少于 1 秒(不确定我从哪里得到的印象)。
请分享一些见解,谢谢。
为了防止 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" 直到显式调用函数;在导入模块时触发登录是疯狂的。
背景:我正在努力减少完成测试所需的时间运行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(如果这不是流程,请纠正我)。
- 有什么方法可以防止 Python 在读取脚本时执行脚本(无需将代码包装在函数中)?
- 如果是,最Python处理这个问题的方法是什么?
- 此外,一个写得很好的测试默认需要多长时间才能达到 运行。我认为这应该少于 1 秒(不确定我从哪里得到的印象)。
请分享一些见解,谢谢。
为了防止 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" 直到显式调用函数;在导入模块时触发登录是疯狂的。