简介:当导入某个python模块时,我希望能够拦截这个动作,而不是加载所需的类,我想加载我选择的另一个类.
原因:我正在研究一些遗留代码.在开始一些增强/重构之前,我需要编写一些单元测试代码.但是,代码会导入某个模块,该模块在单元测试设置中会失败.(由于数据库服务器依赖性)
Pseduo代码:
from LegacyDataLoader import load_me_data
...
def do_something():
data = load_me_data()
Run Code Online (Sandbox Code Playgroud)
因此,理想情况下,当python在单元测试中使用上面的导入行时,会加载替代类MockDataLoader.
我还在使用2.4.3.我想有一个我可以操纵的导入钩子
编辑
非常感谢到目前为止的答案.他们都非常有帮助.
一种特殊类型的建议是关于操纵PYTHONPATH.它在我的情况下不起作用.所以我将在这里阐述我的具体情况.
原始代码库以这种方式组织
./dir1/myapp/database/LegacyDataLoader.py
./dir1/myapp/database/Other.py
./dir1/myapp/database/__init__.py
./dir1/myapp/__init__.py
Run Code Online (Sandbox Code Playgroud)
我的目标是在Other模块中增强Other类.但是因为它是遗留代码,所以如果不首先将测试套件捆绑在一起,我会感到很自在.
现在我介绍一下这个单元测试代码
./unit_test/test.py
Run Code Online (Sandbox Code Playgroud)
内容很简单:
from myapp.database.Other import Other
def test1():
o = Other()
o.do_something()
if __name__ == "__main__":
test1()
Run Code Online (Sandbox Code Playgroud)
当CI服务器运行上述测试时,测试失败.这是因为类Other使用LegacyDataLoader,而LegacydataLoader无法从CI框建立与数据库服务器的数据库连接.
现在让我们按照建议添加一个假类:
./unit_test_fake/myapp/database/LegacyDataLoader.py
./unit_test_fake/myapp/database/__init__.py
./unit_test_fake/myapp/__init__.py
Run Code Online (Sandbox Code Playgroud)
将PYTHONPATH修改为
export PYTHONPATH=unit_test_fake:dir1:unit_test
Run Code Online (Sandbox Code Playgroud)
现在测试失败了另一个原因
File "unit_test/test.py", line 1, in <module>
from myapp.database.Other import Other
ImportError: No module named Other
Run Code Online (Sandbox Code Playgroud)
它与python解析模块中的类/属性的方式有关
我正在制作一个图像选择器,当弹出选择器时,它将显示n×n可选按钮网格.这个按钮网格将包含在NSWindow中,但是如果用户点击屏幕,我希望窗口自动关闭.是否有可以设置的标志,以便当窗口失去焦点时它会自动关闭?
我在尝试删除上传的图片时遇到了问题.
错误是这样的:
SuspiciousOperation: Attempted access to '/media/artists/12-stones/154339.jpg' denied.
Run Code Online (Sandbox Code Playgroud)
看完后看起来错误是因为它正在寻找错误位置的图像(注意第一个斜杠,/ media /文件系统上不存在)
我的MEDIA_ROOT和MEDIA_URL是:
MEDIA_ROOT = '/home/tsoporan/site/media/'
MEDIA_URL = "/media/
Run Code Online (Sandbox Code Playgroud)
我的模型upload_to参数传递了这个函数:
def get_artist_path(instance, filename):
return os.path.join('artists', slugify(instance.name), filename)
Run Code Online (Sandbox Code Playgroud)
我的问题是:
1)如何解决此问题以备将来上传?
2)是否可以修复当前图像的路径而无需重新上载?
此致,提图斯
我有一个XSD正在经历从一组元素到另一组元素的转换.在转换过程中,会有代码期望新元素和代码期望旧元素.因此,我需要保留XSD中的旧元素; 我将它们记录为已弃用(在xs:documentation元素中使用自由文本).
有没有办法将元素标记为已弃用,以便xmllint等工具会在有人使用不推荐使用的元素时自动发出警告?
我目前使用以下非常繁琐的"servlet样式"方法进行Grails 301 URL重定向:
def action = {
...
if (shouldRedirect) {
response.status = 301
response.setHeader("Location", "http://url/to/redirect/to.html")
render("")
return false
}
...
}
Run Code Online (Sandbox Code Playgroud)
是否有更清洁,更紧凑的Groovy/Grails'y方式来执行301重定向?
请注意,我所说的是301重定向,而不是使用标准Grails redirect(...)机制可以实现的标准302重定向.
是否通过Axis2线程安全从WSDL生成客户端存根?
当然,"线程安全"不是一个严格定义的术语,所以我至少对以下内容感兴趣:
是不同的不同的线程同时访问相同的stub类的实例,用同样有效的行为作为单线程运行?
同一个存根类的单个实例是否可以由不同的线程并发访问,并且在单线程执行中以相同的方式交错相同的有效行为?
我一直在努力构建一个简单的3D图形引擎,我正在尝试找到一个好的基于整数的线光栅化算法.(我不是想重新发明轮子,我试图更深入地了解轮子).
是否有任何线光栅化算法不依赖于任何浮点数学?
谢谢.
我想在ASM内核中设置视频模式我正在处理视频模式1920x1080或更高(或至少高于VESA中的通常限制).反正有没有这样做,如果有,提供示例代码?
我正在使用NASM来编写内核代码.
我在Android模拟器中生成了一些信息,我能看到的唯一方法就是使用Log类.
但是,您无法从DDMS日志窗口进行复制和粘贴.这真的很烦人,因为我无法在其他应用程序中使用这些信息,例如,无需重新输入.
有没有更好的方法从模拟器中获取调试信息?编写更复杂的应用程序会发生什么?当您需要验证它是否正在将正确的信息写入URL,数据库,文件等时,您会怎么做?
谢谢!
Python的迭代器很棒,但有时候我确实想要一个C风格的循环 - 而不是一个foreach循环.例如,我有一个开始日期和结束日期,我想在该范围内的每一天做一些事情.当然,我可以使用while循环执行此操作:
current = start
while current <= finish:
do_stuff(current)
current += timedelta(1)
Run Code Online (Sandbox Code Playgroud)
这是有效的,但它是3行而不是1行(在基于C或C的语言中),我经常发现自己忘记编写递增行,特别是如果循环体非常复杂.在Python中有没有更优雅,更不容易出错的方法?