[英]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.