【发布时间】:2019-04-07 10:34:59
【问题描述】:
这是一个令人不安的问题。对于函数:
def influencePositive(q1, q2):
if(q1.magnitude.greaterZero()):
q2.derivative.value = DValue.add(q2.derivative.value, 1)
以下单元测试运行没有问题:
def test_i_plus_active(self):
q1 = Quantity(Magnitude(MValue.PLUS), None)
q2 = Quantity(None, Derivative(DValue.ZERO))
r.influencePositive(q1, q2)
self.assertEqual(q2.derivative.value, DValue.PLUS)
但是对于这个其他功能:
def exogenous(q1, q2, value):
if type(value) == int:
q2.derivative.value = DValue.add(q1.derivative.value, value)
以下单元测试中断:
def test_ex_increase_minus(self):
q1 = Quantity(None, DValue.MINUS)
q2 = Quantity(None, DValue.MINUS)
r.exogenous(q1, q2, 1)
self.assertEqual(q2.derivative.value, DValue.ZERO)
它会引发属性错误:AttributeError: can't set attribute。这就是整个回溯:
Traceback (most recent call last):
File "C:/Users/Victor Zuanazzi/Documents/Artificial Intelligence/Knowledge Representation/Practicals/Qualitative_Reaoning/relationFunction_test.py", line 121, in test_ex_increase_minus
r.exogenous(q1, q2, 1)
File "C:\Users\Victor Zuanazzi\Documents\Artificial Intelligence\Knowledge Representation\Practicals\Qualitative_Reaoning\relationFunctions.py", line 31, in exogenous
q2.derivative.value = DValue.add(q1.derivative.value, value)
File "C:\ProgramData\Anaconda3\lib\types.py", line 146, in __set__
raise AttributeError("can't set attribute")
AttributeError: can't set attribute
这里有一些了解上面代码的背景知识。
DValue 是一个 IntEnum:
from enum import IntEnum
class DValue(IntEnum):
MINUS = -1
ZERO = 0
PLUS = 1
@staticmethod
def add(dvalue, delta):
return max(min(dvalue + delta, DValue.PLUS), DValue.MINUS)
我们用它来设置类 Derivative:
class Derivative:
def __init__(self, value):
#if value is type int, it is converted to Enum.
if value is int:
value = DValue(value)
self.value = value
Quantity 是一个类,它的实例具有大小和导数值:
from magnitude import Magnitude, MValue
from derivative import Derivative, DValue
class Quantity:
def __init__(self, magnitude, derivative):
self.magnitude = magnitude
self.derivative = derivative
我不明白为什么influencePositive() 工作正常而exogenous() 中断。他们都以相同的方式调用DValue.add()。
【问题讨论】:
标签: python python-3.x unit-testing class enums