[英]IntEnum returning AttributeError: can't set attribute
這是一個令人不安的問題。 對於功能:
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)
它引發了一個Atribute錯誤:AttributeError:無法設置屬性。 這就是整個追溯:
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
數量是一個類,其大小和派生值設置為它的實例:
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()
。
這是你的問題:
在第一次測試的情況下,導數是Derivative
對象,可以重新分配其.value
屬性。 在第二個測試中,導數是DValue
( IntEnum
)對象,其.value
屬性無法重新分配。
In [4]: d = Derivative(DValue.ZERO)
In [5]: d.value
Out[5]: <DValue.ZERO: 0>
In [6]: d.value = 1
In [7]: d.value
Out[7]: 1
In [8]: d = DValue.MINUS
In [9]: d.value
Out[9]: -1
In [10]: d.value = 1
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-10-3c0164b4d46d> in <module>()
----> 1 d.value = 1
/home/ethan/.local/lib/python2.7/site-packages/enum/__init__.pyc in __set__(self, instance, value)
54
55 def __set__(self, instance, value):
---> 56 raise AttributeError("can't set attribute")
57
58 def __delete__(self, instance):
AttributeError: can't set attribute
所以我認為你的第二次測試應該像這樣建立q2
:
q2 = Quantity(None, Derivative(DValue.MINUS))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.