繁体   English   中英

如何检查对象是否为负数

[英]How do I check an object for negative numbers

我有一个对象,其中包含两个微分方程的值。

例如:

#create equation object
class EquationValues(object):
    x         = 0
    y         = 0
    xMin      = 0
    xMax      = 0
    yMin      = 0
    yMax      = 0
    deltaTime = 0

# Class constructor/initilizer
    def __init__(self, x, y, xMin, xMax, yMin, yMax, deltaTime):
        self.x         = x
        self.y         = y
        self.xMin      = xMin
        self.xMax      = xMax
        self.yMin      = yMin
        self.yMax      = yMax
        self.deltaTime = deltaTime

def make_equationValues(x, y, xMin, xMax, yMin, yMax, deltaTime):
    equationValues = EquationValues(x, y, xMin, xMax, yMin, yMax, deltaTime)
    return equationValues

with open ('inputs.csv', 'r') as f:
    reader   = csv.reader(f, delimiter = ',')
    data     = list(reader)
    rowCount = len(data)

while x < rowCount:

    try:
        # Set variables and make sure they are the right format
        x         = float(data[x][0])
        y         = float(data[x][1])
        xMin      = float(data[x][2])
        xMax      = float(data[x][3])
        yMin      = float(data[x][4])
        yMax      = float(data[x][5])
        deltaTime = float(data[x][6])

        # Check for negative input, if negative throw value error
        if (x < 0) or (y < 0) or (xMin < 0) or (xMax < 0) or (yMin < 0) or ( yMax < 0) or (deltaTime < 0):
            raise ValueError

如何有效检查负值的所有值?

目前,我可以通过在try / except中使用and if语句来做到这一点

例如:

if (x < 0) or (y < 0) or (xMin < 0) or (etc):
    raise ValueError

这似乎不是最好的方法。 有一个更好的方法吗?

如果您的代码确实有效(如果这些是属性,则无效),您可以这样重写它:

if any(var < 0 for var in (x, y, xMin, xMax, yMin, yMax, deltaTime)):
    raise ValueError

由于您要检查的变量只是名称的集合,因此您无能为力。 如果它们是列表,字典或NamedTuple等,则还有更多的改进空间。

如果检查应该采取到位make_equationValues()但你为什么不只是把支票在构造函数?),你更多变数比你展示,你可以简化像这样的检查:

def make_equationValues(*args):
    if any(var < 0 for var in args):
        raise ValueError

    return EquationValues(*args)

但是我不建议这样做,因为您不再需要函数的参数签名,这使其易于出错且难以维护。

您可以使用any语句检查它们是否为负。

class EquationValues(object):
    def __init__(self, x, y, xMin, xMax, yMin, yMax, deltaTime):    
        self.x         = x
        self.y         = y
        self.xMin      = xMin
        self.xMax      = xMax
        self.yMin      = yMin
        self.yMax      = yMax
        self.deltaTime = deltaTime

        negatives = any(v for v in {x,y,xMin,xMax,yMin,yMax,deltaTime} if v < 0)
        if negatives:
            raise ValueError("One variable is negative")

EquationValues(0,0,0,0,0,0,-1) 
# ValueError: "One variable is negative"

您还可以使用locals()获取当前局部作用域变量的字典。

class EquationValues(object):
    def __init__(self, x, y, xMin, xMax, yMin, yMax, deltaTime):    
        self.x         = x
        self.y         = y
        self.xMin      = xMin
        self.xMax      = xMax
        self.yMin      = yMin
        self.yMax      = yMax
        self.deltaTime = deltaTime

        if [v for v in locals().values() if isinstance(v, int) if v < 0]:
            raise ValueError("One variable is negative")

EquationValues(0,0,0,0,0,0,-1) 
# ValueError: "One variable is negative"

这里的示例是从Python Descriptor Demystified复制的。

您应该使用描述符存储必须限制为某些值的属性。 描述符可用于防止在使用描述符类定义的任何属性上设置无效值:

from weakref import WeakKeyDictionary

class NonNegativeNumber(object):
    def __init__(self):
        self.data = WeakKeyDictionary()

    def __get__(self, obj, objtype):
        return self.data.get(obj, 0)

    def __set__(self, obj, val):
        if val < 0:
            raise ValueError('must be nonnegative value')
        self.data[obj] = val

然后您的原始类将如下所示:

class EquationValues(object):
    x         = NonNegativeNumber()
    y         = NonNegativeNumber()
    xMin      = NonNegativeNumber()
    xMax      = NonNegativeNumber()
    yMin      = NonNegativeNumber()
    yMax      = NonNegativeNumber()
    deltaTime = NonNegativeNumber()

    def __init__(self, x, y, xMin, xMax, yMin, yMax, deltaTime):
        self.x = x
        self.y = y
        self.xMin = xMin
        self.xMax = xMax
        self.yMin = yMin
        self.yMax = yMax
        self.deltaTime = deltaTime

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM