使用 If not function(): 控制 Python 中的流程
Using If not function(): to control flow in Python
我有一个带有更新方法的对象class:这个方法简单地进行一些检查并更新对象的属性,什么都没有返回一个布尔值返回到判断是否删除。
其中一些检查结果会阻止其他检查结果的执行:
编辑,旧代码块:
def updateObject(self):
self.checkOne()
if not self.checkTwo():
self.checkThree():
def checkTwo(self):
if self.x == condition:
self.y = different value
return True
return False
新代码块:
class MyObject():
def __init__(self, firstValueHash: int):
self.identifier # str (unused in this example)
self.isMarked # bool
# maxObserved is always greater than maxTrackedTicks
self.maxObservedTicks # int
self.maxTrackedTicks # int
self.ticksSinceUpdate # int
self.ticksSinceMarked # int
self.trackData = [None]*self.maxObservedTicks-1 # list of ints
self.trackData.append(firstValueHash)
# called externally once every 5 mins, returns True if object needs deleting, otherwise returns false
def performUpdate(self):
self.ticksSinceUpdate += 1
self.trackData = self.trackData[1:(self.maxObservedTicks-1)]
self.trackData.append(None) # some other function updates these None values
if self.ticksSinceUpdate > self.maxObservedTicks:
return True
if not self.__updateIfMarked():
self.__updateIfExpired():
return False
def __updateIfMarked(self):
if self.isMarked == True:
self.ticksSinceMarked += 1
if self.ticksSinceMarked < maxObservedTicks
return True
self.isMarked = False
self.ticksSinceMarked = 0
return False
def __updateIfExpired(self):
if self.ticksSinceUpdate >= maxTrackedTicks:
self.isMarked = None
# Other functions will update of isMarked outside of the 5 min update, by labelling it as True or False
如您所见,checkTwo updateIfMarked() 的结果通过返回确定 checkThree __updateIfExpired() 是否发生一个布尔值。
写起来真的很不舒服,但这是我能想到的最清晰简洁的方式来获得我想要的行为。
这是不好的做法吗?我觉得它打破了“一种工具;一项工作”的规则。我还认为,由于过多的逻辑反转,这可能会使行为变得不清楚...
我已经弄清楚为什么写这篇文章感觉不对了:
如果我们仔细观察 if not self.__updateIfMarked()
语句的整体行为,它本质上是说“只要 bool self.isMarked
为 False,就执行 __updateIfExpired()
,但仅在执行 __updateIfTicked
之后。
至关重要的是,self.isMarked
由 __updateIfTicked
的结果 确定 ,因此必须始终检查 isTicked
是否为真或错误。从 __updateIfTicked
向 if 运算符返回 True 或 False 等同于:
def performUpdate(self):
self.ticksSinceUpdate += 1
self.trackData = self.trackData[1:(self.maxObservedTicks-1)]
self.trackData.append(None) # some other function updates these None values
if self.ticksSinceUpdate > self.maxObservedTicks:
return True
self.__updateIfMarked():
self.__updateIfExpired():
return False
def __updateIfMarked(self):
if self.isMarked == True:
self.ticksSinceMarked += 1
if self.ticksSinceMarked >= maxObservedTicks
self.isMarked = False
self.ticksSinceMarked = 0
def __updateIfExpired(self):
if self.ticksSinceUpdate >= maxTrackedTicks and self.isMarked = False:
self.isMarked = None
操作顺序对于获得预期行为至关重要:滑动缓冲区保留 'Marked' 跟踪之外的实体 window。
是否应该使用 None 作为第三种状态可能值得商榷。也许枚举更合适?
我有一个带有更新方法的对象class:这个方法简单地进行一些检查并更新对象的属性,什么都没有返回一个布尔值返回到判断是否删除。
其中一些检查结果会阻止其他检查结果的执行: 编辑,旧代码块:
def updateObject(self):
self.checkOne()
if not self.checkTwo():
self.checkThree():
def checkTwo(self):
if self.x == condition:
self.y = different value
return True
return False
新代码块:
class MyObject():
def __init__(self, firstValueHash: int):
self.identifier # str (unused in this example)
self.isMarked # bool
# maxObserved is always greater than maxTrackedTicks
self.maxObservedTicks # int
self.maxTrackedTicks # int
self.ticksSinceUpdate # int
self.ticksSinceMarked # int
self.trackData = [None]*self.maxObservedTicks-1 # list of ints
self.trackData.append(firstValueHash)
# called externally once every 5 mins, returns True if object needs deleting, otherwise returns false
def performUpdate(self):
self.ticksSinceUpdate += 1
self.trackData = self.trackData[1:(self.maxObservedTicks-1)]
self.trackData.append(None) # some other function updates these None values
if self.ticksSinceUpdate > self.maxObservedTicks:
return True
if not self.__updateIfMarked():
self.__updateIfExpired():
return False
def __updateIfMarked(self):
if self.isMarked == True:
self.ticksSinceMarked += 1
if self.ticksSinceMarked < maxObservedTicks
return True
self.isMarked = False
self.ticksSinceMarked = 0
return False
def __updateIfExpired(self):
if self.ticksSinceUpdate >= maxTrackedTicks:
self.isMarked = None
# Other functions will update of isMarked outside of the 5 min update, by labelling it as True or False
如您所见,checkTwo updateIfMarked() 的结果通过返回确定 checkThree __updateIfExpired() 是否发生一个布尔值。
写起来真的很不舒服,但这是我能想到的最清晰简洁的方式来获得我想要的行为。
这是不好的做法吗?我觉得它打破了“一种工具;一项工作”的规则。我还认为,由于过多的逻辑反转,这可能会使行为变得不清楚...
我已经弄清楚为什么写这篇文章感觉不对了:
如果我们仔细观察 if not self.__updateIfMarked()
语句的整体行为,它本质上是说“只要 bool self.isMarked
为 False,就执行 __updateIfExpired()
,但仅在执行 __updateIfTicked
之后。
至关重要的是,self.isMarked
由 __updateIfTicked
的结果 确定 ,因此必须始终检查 isTicked
是否为真或错误。从 __updateIfTicked
向 if 运算符返回 True 或 False 等同于:
def performUpdate(self):
self.ticksSinceUpdate += 1
self.trackData = self.trackData[1:(self.maxObservedTicks-1)]
self.trackData.append(None) # some other function updates these None values
if self.ticksSinceUpdate > self.maxObservedTicks:
return True
self.__updateIfMarked():
self.__updateIfExpired():
return False
def __updateIfMarked(self):
if self.isMarked == True:
self.ticksSinceMarked += 1
if self.ticksSinceMarked >= maxObservedTicks
self.isMarked = False
self.ticksSinceMarked = 0
def __updateIfExpired(self):
if self.ticksSinceUpdate >= maxTrackedTicks and self.isMarked = False:
self.isMarked = None
操作顺序对于获得预期行为至关重要:滑动缓冲区保留 'Marked' 跟踪之外的实体 window。
是否应该使用 None 作为第三种状态可能值得商榷。也许枚举更合适?