我有一个类,它是一组单词:
import math
from typing import Self
FREQUENCIES: dict[str, float] = {}
FREQUENCIES['trial'] = 0.023
FREQUENCIES['raise'] = 0.124
def entropy(probability: float) -> float:
if probability == 0.0: return 0.0
return -probability*math.log(probability)/math.log(2.0)
class Word(str):
def __new__(cls, value: str = 'aaaaa') -> Self:
value = value.strip().lower()
if not re.match(r'[a-z]{5}', value): raise ValueError(f'"{value}" does not follow the pattern [a-z]{5}!')
return super().__new__(cls, value)
def __init__(self, value: str = 'aaaaa') -> None:
self.frequency = FREQUENCIES[value]
class Universe(set[Word]):
def __init__(self) -> None:
super().__init__(set())
self.frequency = 0.0
self.statistics: dict[int, dict[str, float]] = {}
self.updated = True
def __iadd__(self, word: Word) -> Self:
if word in self: return self
self.updated = False
self.add(word)
return self
@property
def uncertainty(self) -> float:
if not self.updated:
self.frequency = sum(word.frequency for word in self)
self.statistics = {i: {chr(letter): sum(wordle.frequency for wordle in self if wordle[i] == chr(letter)) for letter in range(ord('a'), ord('z')+1)} for i in range(len(Word()))}
self.updated = True
return sum(sum(entropy(letterFrequency/self.frequency) for letterFrequency in self.statistics[position].values()) for position in self.statistics)
当我向其中添加(使用 +=)一个元素时,我确保制作了
self.updated
dirty。
这是棘手的部分。 最初,我创建了
@property
来计算 Universe
的不确定性。
我想用这样的东西:
universe = Universe()
universe += Word('trial')
universe += Word('raise')
print(f'My universe has {len(universe)} words and an uncertainty of {universe.uncertainty} bits."
我似乎注意到的奇怪副作用是
self.updated
是始终True
(我可以在调试器窗口上看到它)!!!
如果我删除
@property
,代码的运行方式与我预期的完全一样(self.updated
在我显式调用 True
后才变为 self.uncertainty()
)。
我在这里缺少什么?
解决方案 我正在使用 Visual Studio Code,当变量
universe
出现在调试器窗口上时,其 @property
self.uncertainty
在调试器上显示为 variable (显示其值)。这意味着 Visual Studio Code debugger 正在调用 @property
我调试的每一步,因此它将 self.updated
设置为 True
。
这也解释了为什么当我删除 @property
时,代码“有效”:调试器不会 NOT 自行调用
self.uncertainty()
(将 self.update
设置为 True
)
解决方案 我正在使用 Visual Studio Code,当变量
universe
出现在调试器窗口上时,其 @property
self.uncertainty
在调试器上显示为变量(显示其值)。这意味着 Visual Studio Code 调试器在调试的每一步都会调用 @property
,因此它将 self.updated
设置为 True
。这也解释了为什么当我删除 @property
时代码“有效”:调试器不会自行调用 self.uncertainty()
(将 self.update
设置为 True
)