本文将分享如何使用PythonMock引发异常-但将Errno设置为给定值的详细内容,并且还将对pythonmockserver进行详尽解释,此外,我们还将为大家带来关于asp.net-mvc-3–如
本文将分享如何使用Python Mock引发异常-但将Errno设置为给定值的详细内容,并且还将对python mock server进行详尽解释,此外,我们还将为大家带来关于asp.net-mvc-3 – 如何将模型绑定中使用的所有ValueProviderResult的文化设置为给定值?、c – 如何有效地将cv :: Mat的给定通道设置为给定值而不改变其他通道?、Cygwin上使用Python 3.7的Flask / Werkzeug:BlockingIOError:[Errno 11]资源暂时不可用、Docker如何将python 3.8设置为默认值的相关知识,希望对你有所帮助。
本文目录一览:- 如何使用Python Mock引发异常-但将Errno设置为给定值(python mock server)
- asp.net-mvc-3 – 如何将模型绑定中使用的所有ValueProviderResult的文化设置为给定值?
- c – 如何有效地将cv :: Mat的给定通道设置为给定值而不改变其他通道?
- Cygwin上使用Python 3.7的Flask / Werkzeug:BlockingIOError:[Errno 11]资源暂时不可用
- Docker如何将python 3.8设置为默认值
如何使用Python Mock引发异常-但将Errno设置为给定值(python mock server)
给出以下Python代码:
elif request.method == ''DELETE'': try: os.remove(full_file) return jsonify({''results'':''purged %s'' % full_file}) except OSError as e: if e.errno != errno.ENOENT: raise return jsonify({''results'':''file not present: %s'' % full_file})
我想测试所有可能的路径,包括异常处理。使用Mock可以很容易地 引发 异常,这是我使用以下代码完成的:
with patch(''os.remove'', new=Mock(side_effect=OSError(errno.ENOENT))): self.assertRaises(OSError, self.app.delete, file_URL) # broken
Mock引发一个异常,该异常的打印值为2(ENOENT)-但是 e.errno 设置为NONE。到目前为止,我还没有找到一种设置方法。结果是,总是会
引发 异常,而在单元测试中,我从未到达最后一行代码。
我也尝试过用errno设置创建一个虚拟类,并返回它。但是,除非设置了 side_effect
,否则它不会引发异常,并且当我设置side_effect时,我不会获得object.errno作为返回值。
有没有办法让Mock引发Exception,而该Exception对象设置了 errno 属性?
答案1
小编典典将两个参数传递给OSError构造函数。(第一个应该是errno
)。
例如:
>>> OSError(2).errno>>> OSError(2, ''message'').errno2>>> OSError(2, ''message'').strerror''message''
asp.net-mvc-3 – 如何将模型绑定中使用的所有ValueProviderResult的文化设置为给定值?
Here是更多信息.
我看到这是由ValueProviderResult对象的Culture属性控制的,它们是从IValueProvider.GetValue()返回的.
我的问题是:如何全局确保此值始终为CultureInfo.InvariantCulture.
我知道我可以实现自定义值提供程序并以这种方式执行.
我知道我可以实现自定义模型绑定器并以这种方式执行.
我知道我可以在线程中设置文化,但不幸的是,这不是我的选择.
我正在寻找的是一种设置它的方法,以便即使是默认的模型绑定器和现有的值提供者也能够以文化不变的方式解析,而不管线程文化的设置是什么.
解决方法
原因:所有默认的ValueProviders都是硬编码的,可以使用CultureInfo.InvariantCulture或CultureInfo.CurrentCulture.
具体来说,就是FormValueProvider的做法:
internal FormValueProvider( ControllerContext controllerContext,IUnvalidatedRequestValues unvalidatedValues ) : base( controllerContext.HttpContext.Request.Form,unvalidatedValues.Form,CultureInfo.CurrentCulture // <--- Grrr,argh ) { }
不从其他任何地方检索文化(即,上面的论证不是默认使用,而是作为一种文化使用).
不同的IValueProviders的文化
作为参考,这些是每个默认IValueProviders的文化:
> ChildActionValueProvider:InvariantCulture
> FormValueProvider:CurrentCulture
> JsonValueProvider:CurrentCulture
> RouteDataValueProvider:InvariantCulture
> QueryStringValueProvider:InvariantCulture
> HttpFileCollectionValueProvider:InvariantCulture
替换CurrentCulture IValueProviders
替换FormValueProvider并不是一项艰巨的任务,因为如上所述,它只是调用它的基类'(NameValueCollectionValueProvider)构造函数 – 它将所需的文化作为参数.
FormValueProvider的原始实现在表面上看起来比实际更难,引用了内部类和接口.但是为了取代提供者而不需要它们 – 它们仅用于单元测试.
您只需要调用基本构造函数(如上所述),传递两个易于获取的NameValueCollections:Request.Forms和Validation.Unvalidated(Request)的Forms属性(静态方法).并将第三个参数设置为您想要的文化.
FormValueProviderFactory更加简单明了.
JsonValueProvider有点复杂 – 基本上你必须将JsonValueProviderFactory的源代码复制到一个新类并修改它 – 因为虽然它允许重写GetValueProvider(),但该方法主要包括对其他私有静态方法的调用.
编辑(Petar Ivanov):这对我有用.为了使其工作,仅将自定义工厂添加到ValueProviderFactories.Factories是不够的,因为这是在FormValueProviderFactory之后添加的.相反,我不得不用自定义的FormValueProviderFactory替换它.
c – 如何有效地将cv :: Mat的给定通道设置为给定值而不改变其他通道?
cv::Mat mat; // with type CV_BGRA...mat.getChannel(3) = Scalar(120); // <- this is what I want to do
P.S .:我的当前解决方案首先将mat拆分成多个通道,并设置alpha通道,然后将它们合并.
P.S.2:我知道如果我也想改变其他渠道,我可以快速做到这一点:
mat.setTo(Scalar(54,154,65,120));
更新与广义解决方案:
两种方法都可用于将给定通道上的所有垫值设置为给定值.并且它们将适用于所有矩阵,无论它们是否连续.
方法1 – 更有效率
– >基于@ Antonio的答案,并由@MichaelBurdinov进一步改进
// set all mat values at given channel to given valuevoid setChannel(Mat &mat,unsigned int channel,unsigned char value){ // make sure have enough channels if (mat.channels() < channel + 1) return; const int cols = mat.cols; const int step = mat.channels(); const int rows = mat.rows; for (int y = 0; y < rows; y++) { // get pointer to the first byte to be changed in this row unsigned char *p_row = mat.ptr(y) + channel; unsigned char *row_end = p_row + cols*step; for (; p_row != row_end; p_row += step) *p_row = value; }}
方法2 – 更优雅
– >基于@ MichaelBurdinov的答案
// set all mat values at given channel to given valuevoid setChannel(Mat &mat,unsigned char value){ // make sure have enough channels if (mat.channels() < channel+1) return; // check mat is continuous or not if (mat.isContinuous()) mat.reshape(1,mat.rows*mat.cols).col(channel).setTo(Scalar(value)); else{ for (int i = 0; i < mat.rows; i++) mat.row(i).reshape(1,mat.cols).col(channel).setTo(Scalar(value)); }}
P.S .:值得注意的是,根据documentation,使用Mat :: create()创建的矩阵始终是连续的.但是,如果使用Mat :: col(),Mat :: diag()等提取矩阵的一部分,或者为外部分配的数据构造矩阵头,则此类矩阵可能不再具有此属性.
解决方法
mat.reshape(1,mat.rows*mat.cols).col(3).setTo(Scalar(120));
如果不连续:
for(int i=0; i<mat.rows; i++) mat.row(i).reshape(1,mat.cols).col(3).setTo(Scalar(120));
编辑(感谢Antonio发表评论):
请注意,这段代码可能是最短的,它没有分配新的内存,但根本没有效率.它可能甚至比分割/合并方法更慢.当OpenCV对于连续1个像素的非连续矩阵执行操作时,效率是非常低的.如果时间性能很重要,您应该使用@Antonio提出的解决方案.
只是他的解决方案略有改进:
const int cols = img.cols;const int step = img.channels();const int rows = img.rows;for (int y = 0; y < rows; y++) { unsigned char* p_row = img.ptr(y) + SELECTED_CHANNEL_NUMBER; //gets pointer to the first byte to be changed in this row,SELECTED_CHANNEL_NUMBER is 3 for alpha unsigned char* row_end = p_row + cols*step; for(; p_row != row_end; p_row += step) *p_row = value; }}
这可以节省x的增量操作和一个较小的寄存器值.在资源有限的系统上,可以提供〜5%的加速.否则时间表现将是一样的.
Cygwin上使用Python 3.7的Flask / Werkzeug:BlockingIOError:[Errno 11]资源暂时不可用
在正确的Cygwin安装中,共享库始终在比fork失败的情况下更高的地址上运行。
要查看预期范围,可以查看基址数据库。
在我当前的系统上:
$ rebase -si | awk '{ print $3,$1}' |sort |head -n 5
0x0003ce2c0000 /usr/libexec/coreutils/libstdbuf.so
0x0003ce2d0000 /usr/lib/texinfo/XSParagraph.dll
0x0003ce2e0000 /usr/lib/texinfo/Parsetexi.dll
0x0003ce310000 /usr/lib/texinfo/MiscXS.dll
0x0003ce320000 /usr/lib/sasl2_3/cygscram-3.dll
$ rebase -si | awk '{ print $3,$1}' |sort -r |head -n 5
0x0003fffd0000 /usr/bin/cygEGL-1.dll
0x0003fffa0000 /usr/bin/cygEMF-1.dll
0x0003fff20000 /usr/bin/cygFLAC-8.dll
0x0003ffea0000 /usr/bin/cygGL-1.dll
0x0003ffe30000 /usr/bin/cygGLU-1.dll
因此,或者您的数据库已损坏并且重新设置基准未正确执行,或者BLODA正在干扰正确加载dll。
Docker如何将python 3.8设置为默认值
以这种方式替换系统python通常不是一个好主意(因为它可能破坏依赖于那些可执行文件的操作系统级程序)–我在this video I made "why not global pip / virtualenv?"中做了一点介绍>
一种更好的方法是创建一个前缀并将其放在PATH
之前(这可以使系统可执行文件继续工作,但是仅使用python
/ python3
等)您的其他可执行文件)
在您似乎正在使用Deadsnakes的情况下,类似这样的方法应该起作用:
FROM ubuntu:bionic
RUN : \
&& apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
software-properties-common \
&& add-apt-repository -y ppa:deadsnakes \
&& DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
python3.8-venv \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* \
&& :
RUN python3.8 -m venv /venv
ENV PATH=/venv/bin:$PATH
ENV
行是此处的关键,它将virtualenv放在路径的开头
$ docker build -t test .
...
$ docker run --rm -ti test bash -c 'which python && python --version && which pip && pip --version'
/venv/bin/python
Python 3.8.5
/venv/bin/pip
pip 20.1.1 from /venv/lib/python3.8/site-packages/pip (python 3.8)
免责声明:我是死蛇的维护者
,为什么不仅仅使用所需的配置从ubuntu:18.04构建新映像? 像这样:
FROM ubuntu:18.04
RUN apt update
RUN apt install software-properties-common -y
RUN add-apt-repository ppa:deadsnakes/ppa
RUN apt install python3.8 -y
RUN ln -s /usr/bin/pip3 /usr/bin/pip
RUN ln -s /usr/bin/python3.8 /usr/bin/python
今天关于如何使用Python Mock引发异常-但将Errno设置为给定值和python mock server的分享就到这里,希望大家有所收获,若想了解更多关于asp.net-mvc-3 – 如何将模型绑定中使用的所有ValueProviderResult的文化设置为给定值?、c – 如何有效地将cv :: Mat的给定通道设置为给定值而不改变其他通道?、Cygwin上使用Python 3.7的Flask / Werkzeug:BlockingIOError:[Errno 11]资源暂时不可用、Docker如何将python 3.8设置为默认值等相关知识,可以在本站进行查询。
本文标签: