问题:numarrayc扩展错误处理?

我正在为numarray写一个c扩展程序,并且对这个成语感到困惑 用于错误处理. 文档似乎说一个人应该始终将一个数组删除 调用na_inputarray等,将numarray arg转换为c数组. 但是,示例和数字代码也表明可以 提早返回(例如)pyerr_format而无需进行剪切. 例如,我附加了样本的缩写版本 代码. 注释? 我会向前耕种并效法该例子(即尽早 返回),但我想知道是否有人知道为什么还可以. 也许我 应提出对Numarray项目的请求,以澄清 文档. - 罗素 静态pyObject *py_convolve1d(pyObject *obj,pyobject *args) { PyObject *okernel,...; pyarrayObject *kernel ...; 如果(!pyarg_parsetuple(args," oo | o",&okernel,...) 返回pyerr_format(_convolveError, " Convolve1d:无效参数."); / *对齐,byteswap,连续,typeconvert */ kernel = na_ioarray(okernel,tfloat64,c_array); ... 如果(!内核...) 返回pyerr_format(_convolveError, " Convolve1d:错误转换数组输入."); ... py_xdecref(内核); ... } 文档的相关部分(第12.3节高级API): 每个函数的返回值(na_inputarray,na_outputarray或 na_ioarray)是对原始numarray对象的引用,或者是 引用临时数字. 执行C代码之后 扩展功能主体该指针应 *始终 *被破坏.

# 回答1

在某个时候," Russell E. Owen" 写道: 就我个人而言,我这样写了: 静态pyObject *py_convolve1d(pyObject *obj,pyobject *args) { PyObject *okernel,...; pyarrayObject *kernel = null; 如果(! pyerr_format(_convolveError, " Convolve1d:无效参数."); goto错误; } kernel = na_ioarray(okernel,tfloat64,c_array); 如果(!内核...){ pyerr_format(_convolveError, " Convolve1d:错误转换数组输入."); goto错误; } ...更多东西... py_xdecref(内核) 返回结果 错误: py_xdecref(内核) 返回null; } 请注意,内核是初始化为null的,因此PY_XDECREF将在 所有情况. 这样的清洁错误处理代码是少数几个 我在C中使用的地方.您现在只有两个出口 功能,在底部,因此更容易跟踪 需要剥夺的东西. - - |> | \/| < /----------------------------------------------------------------------------- ---------------------------------- \ | David M. Cooke | cookedm(at)物理(dot)mcmaster(dot)ca
# 回答2

在文章中 cothydeydeydeydeydeydydydydydydydydydaydeydeydeydydydydydaydeydeights.m.clysics.mcmaster.ca(David M. Cooke)写道:这也可以(假设这与上述内容之间没有任何参考对象的参考). 如果na_ioarray返回null,则没有任何东西. 恐怕我太选择了提取代码,使它看起来像 甚至没有剥夺. 这是 更完整的提取物. 首先 即使一两个阵列成功,测试也可能失败 "提取",所以想要一个破碎,而两者的更大程度也更大 此后进行测试: ... / *对齐,byteswap,连续,typeconvert */ kernel = na_ioarray(okernel,tfloat64,c_array); data = na_ioArray(ODATA,TFLOAT64,C_ARRAY); 卷积= na_optionalOutputararay(oconvolved,tfloat64,c_array, 数据); 如果(!内核||!数据||!卷积) 返回pyerr_format(_convolveError, " Convolve1d:错误转换数组输入."); if(((kernel-> nd!= 1)||(data-> nd!= 1)) 返回pyerr_format(_convolveError, " Convolve1d:NumArray必须具有1个维度."); if(!na_shapeequal(数据,卷积)) 返回pyerr_format(_convolveError, "卷曲1D:数据和输出数字需要IdentitCal 形状."); convolve1d(内核 - > dimensions [0], na_offsetdata(内核), data-> dimensions [0], na_offsetdata(数据), na_offsetdata(卷积)); py_xdecref(内核); py_xdecref(data); ... 听起来好像我应该在示例上提交错误报告. - 罗素
# 回答3

对于那些拥有的人来说 一直在关注goto线程. 我喜欢它(请参阅最后的代码和不错的 决心回报goto的给予). 我希望库克先生不介意我 "借"他的代码. :-) 在文章中 cothydeydedydeydeydeyderics.mcmaster.ca(David M. Cooke)写道:没关系; 如果pyarg_parsetuple为null,则不会创建对象(或incref'd). 另外,如果不是零,则okernel是借用的参考; 你不应该破坏它. 这也可以(假设这与上述之间没有任何引用对象的内容). 如果na_ioarray返回null,则没有任何东西. 就我个人而言,我这样写了:static pyObject *py_convolve1d(pyObject *obj,pyObject *args){pyObject *okernel,...; pyarrayObject *kernel = null; 如果(! goto错误; } kernel = na_ioarray(Okernel,Tfloat64,c_array); 如果(!内核...){pyerr_format(_convolveError," convolve1d:错误转换阵列输入."); goto错误; } ...更多内容... py_xdecref(内核)返回结果错误:py_xdecref(kernel)return null; }请注意,内核被初始化为null,因此PY_XDECREF在所有情况下都可以使用. 像这样的清洁错误处理代码是我在C中使用的少数几个地方之一,您现在只有两个退出功能,底部只有两个退出,因此更容易地跟踪要削减需要的东西 . - 卢·佩科拉(Lou Pecora) 我的观点是我自己的.
# 回答4

在某个时候,Lou Pecora 写道: 没有问题; 我希望更多的人:-) - - |> | \/| < /----------------------------------------------------------------------------- ---------------------------------- \ | David M. Cooke | cookedm(at)物理(D OT)McMaster(dot)CA
# 回答5

将其转换为使用错误布尔值是任意微不足道的. -Josiah 静态pyObject *py_convolve1d(pyObject *obj,pyobject *args) { PyObject *okernel,...; pyarrayObject *kernel = null; BOOL错误= 0; 如果(! pyerr_format(_convolveError, " Convolve1d:无效参数."); 错误= 1; } kernel = na_ioarray(okernel,tfloat64,c_array); 如果(!内核...){ pyerr_format(_convolveError, " Convolve1d:错误转换数组输入."); 错误= 1; } ...更多东西... 如果(!错误){ py_xdecref(内核) 返回结果 } 别的 { py_xdecref(内核) 返回null; } }
# 回答6

在文章中,约西亚·卡尔森(Josiah Carlson)写道: 您必须记住要检查错误变量的每个步骤 功能,或使用其他条款并处理沉重的嵌套. 这是一个 Goto的完美情况. 乔
# 回答7

>您必须记住要检查错误变量的每个步骤 我确实滑倒了,但这仍然很容易做,我只是没有付款 注意力. 确实显示了goto有用的情况,我会给予 你那 根据代码,可能是宏观的情况 更好地适合. -Josiah
# 回答8

>>>>>" josiah" == josiah carlson 写信: josiah>我确实滑倒了,但这仍然很容易做到 这种"相当容易"忽略了您以后需要添加或 修改函数返回之前必须执行的行. 宏 可能是一个解决方案,尽管我认为goto解决方案清洁器(不 需要单独的语言(因此不同的缩进规则),不会 污染名称空间,简化编译器以减少编译的代码尺寸等). 问候, 以撒.

标签: python

添加新评论