我创建了一个简单的类来反映基于L的立方体的情感分类。这段代码一点也不科学,我只是为了好玩才这么做的,但我希望我编写的所有代码都尽可能地具有Pythonic和效率,所以我希望能得到一些帮助来重构它。
Emoter类摄取5-羟色胺、多巴胺和去甲肾上腺素水平,通过set_levels功能决定情绪者的情绪。每个神经递质的“高”、“低”和“正常”水平的阈值取决于过去的经验,而超出可接受范围的值会杀死Emoter。
我希望使我的代码尽可能高效和可读性,因此欢迎任何建议。
class Emoter:
"""
Create an instance of the class with a name.
Use set_levels to set neurotransmitter levels for dopamine, serotonin, and noradrenaline.
Check current emotion with emotion attribute.
"""
def __init__(self, name):
self.name = name
self.status = "alive"
self.thresholds = {}
self.level = {}
self.count = {}
self.thresholds["dopamine"] = [0, 25, 75, 100]
self.thresholds["noradrenaline"] = [0, 25, 75, 100]
self.thresholds["serotonin"] = [0, 25, 75, 100]
self.level["dopamine"] = "normal"
self.level["noradrenaline"] = "normal"
self.level["serotonin"] = "normal"
self.count["dopamine"] = 1
self.count["noradrenaline"] = 1
self.count["serotonin"] = 1
self.emotion = "NEUTRAL"
def __adjust_thresholds(self, neurotransmitter):
"""
Adjusts thresholds for neurotransmitter level evaluations.
A very rudimentary function meant to reflect the effects of LTP and LTD.
Sort of.
"""
if self.count[neurotransmitter] > 3:
if self.level[neurotransmitter] is "low":
print(self.name + "'s " + neurotransmitter + " levels have " +
"been " + self.level[neurotransmitter] + " lately, " +
"resulting in decreased sensitivity.")
self.thresholds[neurotransmitter][1] = self.thresholds[neurotransmitter][1] + 1
if self.thresholds[neurotransmitter][1] >= self.thresholds[neurotransmitter][2] - 1:
self.thresholds[neurotransmitter][2] = self.thresholds[neurotransmitter][2] + 1
elif self.level[neurotransmitter] is "high":
print(self.name + "'s " + neurotransmitter + " levels have " +
"been " + self.level[neurotransmitter] + " lately, " +
"resulting in increased sensitivity.")
self.thresholds[neurotransmitter][2] = self.thresholds[neurotransmitter][2] - 1
if self.thresholds[neurotransmitter][2] <= self.thresholds[neurotransmitter][1] - 1:
self.thresholds[neurotransmitter][1] = self.thresholds[neurotransmitter][1] - 1
if self.count[neurotransmitter] > 5:
if (self.level[neurotransmitter] is "normal" and
self.thresholds[neurotransmitter][2] < self.thresholds[neurotransmitter][3] - 1 and
self.thresholds[neurotransmitter][1] > self.thresholds[neurotransmitter][0] + 1):
print(self.name + "'s " + neurotransmitter + " levels have " +
"been " + self.level[neurotransmitter] + " lately, " +
"resulting in increased resilience.")
self.thresholds[neurotransmitter][2] = self.thresholds[neurotransmitter][2] + 1
self.thresholds[neurotransmitter][1] = self.thresholds[neurotransmitter][1] - 1
def __add_count(self, neurotransmitter, level):
"""
Counts the number of times a subject has been recorded at a given
neurotransmitter level.
"""
if self.level[neurotransmitter] is level:
self.count[neurotransmitter] = self.count[neurotransmitter] + 1
else:
self.count[neurotransmitter] = 1
def __adjust_levels(self, neurotransmitter, level):
"""
Changes neurotransmitter level evaluations based on exact levels.
Also counts the number of times the subject has recorded being at that
level and what, if any, changes should be made to their thresholds.
"""
if self.status is "alive":
if level in range(self.thresholds[neurotransmitter][0],
self.thresholds[neurotransmitter][1]):
self.__add_count(neurotransmitter, "low")
self.level[neurotransmitter] = "low"
self.__adjust_thresholds(neurotransmitter)
elif level in range(self.thresholds[neurotransmitter][1],
self.thresholds[neurotransmitter][2]):
self.__add_count(neurotransmitter, "normal")
self.level[neurotransmitter] = "normal"
self.__adjust_thresholds(neurotransmitter)
elif level in range(self.thresholds[neurotransmitter][2],
self.thresholds[neurotransmitter][3]):
self.__add_count(neurotransmitter, "high")
self.level[neurotransmitter] = "high"
self.__adjust_thresholds(neurotransmitter)
else:
print("BOOM! " + self.name + " is dead!")
self.status = "dead"
def set_levels(self, dopamine, noradrenaline, serotonin):
"""
Set neurotransmitter levels. Different levels result in different
emotions. Consistently high or low levels can lead to increased or
decreased sensitivity to the neurotransmitter.
"""
self.__adjust_levels("dopamine", dopamine)
self.__adjust_levels("noradrenaline", noradrenaline)
self.__adjust_levels("serotonin", serotonin)
self.__determine_emotion()
def __determine_emotion(self):
"""
This needs emotions for when one or more neurotransmitters are within
normal ranges.
"""
if (self.level["dopamine"] is "high" and
self.level["noradrenaline"] is "high" and
self.level["serotonin"] is "high"):
self.emotion = "INTEREST/EXCITEMENT"
elif (self.level["dopamine"] is "high" and
self.level["noradrenaline"] is "high" and
self.level["serotonin"] is "low"):
self.emotion = "ANGER/RAGE"
elif (self.level["dopamine"] is "high" and
self.level["noradrenaline"] is "low" and
self.level["serotonin"] is "high"):
self.emotion = "ENJOYMENT/JOY"
elif (self.level["dopamine"] is "low" and
self.level["noradrenaline"] is "high" and
self.level["serotonin"] is "high"):
self.emotion = "SURPRISE"
elif (self.level["dopamine"] is "high" and
self.level["noradrenaline"] is "low" and
self.level["serotonin"] is "low"):
self.emotion = "FEAR/TERROR"
elif (self.level["dopamine"] is "low" and
self.level["noradrenaline"] is "high" and
self.level["serotonin"] is "low"):
self.emotion = "CONTEMPT/DISGUST"
elif (self.level["dopamine"] is "low" and
self.level["noradrenaline"] is "low" and
self.level["serotonin"] is "high"):
self.emotion = "DISTRESS/ANGUISH"
elif (self.level["dopamine"] is "low" and
self.level["noradrenaline"] is "low" and
self.level["serotonin"] is "low"):
self.emotion = "SHAME/HUMILIATION"
else:
self.emotion = "NEUTRAL"
subject = Emoter("Subject 001")
subject.set_levels(20, 80, 20)
print(subject.emotion)
subject.set_levels(20, 20, 20)
print(subject.emotion)
subject.set_levels(20, 80, 80)
print(subject.emotion)
subject.set_levels(20, 20, 80)
print(subject.emotion)发布于 2014-12-29 22:19:17
is比较实例标识。
==比较等式。
不能保证将两个等效字符串嵌入到同一个实例中。
>>> a = 'x'*30
>>> b = 'x'*30
>>> a is b
False
>>> a == b
True
>>> 即使有保证,仍然应该使用与代码实际意图相匹配的比较运算符。
下面的操作很难读懂:
self.thresholds[neurotransmitter][1] = self.thresholds[neurotransmitter][1] + 1
if self.thresholds[neurotransmitter][1] >= self.thresholds[neurotransmitter][2] - 1:
self.thresholds[neurotransmitter][2] = self.thresholds[neurotransmitter][2] + 1由于这三行中的大多数字符是相同的,它需要读者工作,以找到差异。这是不好的,因为差异是最重要的部分。代码应该使这些方面脱颖而出。
一旦您认识到了这些差异,仍然不清楚代码意味着做什么。将这些代码的全部或部分提取到描述性命名的子方法中,将极大地提高代码的可读性。
print(self.name + "'s " + neurotransmitter + " levels have " +
"been " + self.level[neurotransmitter] + " lately, " +
"resulting in decreased sensitivity.")Python有一个很好的字符串格式API,您应该使用它。
print("{}'s {} levels have been {} lately, resulting in decreased sensitivity.".format(self.name, neurotransmitter, self.level[neurotransmitter]))幻数:把他们从你的代码中拿出来。为什么数到3是有意义的?它与5有什么关系?如果我需要增加3,这是否意味着5也要增加?代码中的所有3s都意味着相同的东西吗?给常量命名并给它们上下文。
最重要的是,将索引显式地添加到列表中意味着每个索引都有重要意义。如果self.thresholds[neurotransmitter][1]与self.thresholds[neurotransmitter][2]不同,它们应该有表明这一点的名称。简单的数据类或命名的元组将更好地替代具有重要索引的列表。如果我不正确地解释这个列表,那是因为代码没有清楚地说明这个列表是用来做什么的。
有许多情况下,您访问self.level,self.thresholds和self.count的特定神经递质。这样就可以删除不同的字典,然后用一个字典来替换,该字典将神经递质映射到包含level、thresholds和counts的数据类。
https://codereview.stackexchange.com/questions/75175
复制相似问题