首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防御性编程类型检查

防御性编程类型检查
EN

Code Review用户
提问于 2014-01-13 07:51:32
回答 2查看 694关注 0票数 5

我对动态类型语言有问题,而且我经常担心类型。

Numpy有不同的行为,取决于某个事物是一个矩阵,一个普通的ndarray,还是一个列表。最初我没有所有这些断言,但我在尝试调试类型错误时插入了这些断言。

代码语言:javascript
复制
from numpy import *
sigmoid = vectorize(lambda(x): 1.0/(1.0+exp(-x)))

def prob_hOn_givenV (v,b,w):
    assert isinstance(v,matrix)
    assert isinstance(w,matrix)
    assert isinstance(b,matrix)
    assert shape(v)[1]==shape(w)[0]
    #print("|v|="+str(shape(v)) +"|w|="+str(shape(w)) )
    return sigmoid(b+v*w) #sum up rows (v is a column vector)

def prob_vOn_givenH (h,a,w):
    assert isinstance(h,matrix)
    assert isinstance(a,matrix)
    assert isinstance(w,matrix)

    assert shape(h)[1]==shape(w.T)[0]

    return sigmoid(a+h*w.T) #sum up columns. (h is a row vector)

有更好的办法吗?也许是一个防御性的编程工具包?代码中也有重复,但我看不到在保留意义的同时删除它的好方法。熟悉受限Boltzman机器的人士将认识到吉布斯抽样用于对比发散的条件公式。

EN

回答 2

Code Review用户

发布于 2014-01-13 11:17:48

首先,我建议完全避免使用matrix类型。它所造成的问题超过了它所提供的小的句法上的方便,在我(和其他许多人)看来。

第二,在numpy中执行此类操作的惯用方法不是断言输入是特定类型,而是将它们强制到ndarray中。np.asarray()有效地做到了这一点;如果输入是ndarray,则输入不受影响地通过;如果它是ndarray子类,那么将创建一个新的ndarray,但只作为原始数据的视图,这样就不会复制数据。

代码语言:javascript
复制
import numpy as np

def sigmoid(x):
    # No need to use vectorize() for this. It's already vectorized.
    return 1.0 / (1.0 + np.exp(-x))

def prob_hOn_givenV(v, b, w):
    v = np.asarray(v)
    b = np.asarray(b)
    w = np.asarray(w)
    # Don't bother checking the shape. `np.dot()` will do that for us.
    # Strictly speaking, the `asarray(v)` and `asarray(w)` aren't necessary
    # since `np.dot(v, w)` already does that internally. But it does no harm.
    return sigmoid(b + np.dot(v, w))
票数 2
EN

Code Review用户

发布于 2014-01-13 14:13:59

这些都是进行各种检查的仿生方法的最佳链接:

前后条件类型强制执行

您可以使用特定的断言集(或用于更复杂的检查的任何其他代码,例如,检查一个ints列表是否真正包含所有ints)作为函数,然后使用该函数作为装饰器的参数,对正在检查的内容进行非常清晰的描述。

接受/返回修饰器是一种快速、干净的检查输入的方法。前后条件检查装饰器更适合用于更大或更复杂的检查集,无论是类型强制执行,还是参数范围,或者数据之间的任何其他关系,比如数组的元素被排序。

我过去常常只在函数中包含所有这些检查,但是对于某些函数,它会使代码变得不可读,因为真正的功能在所有检查中都会丢失。这是一个非常简单的方法来组织您的检查,并使您的代码更容易阅读。

+1不信任鸭子打字;)

票数 0
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/39125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档