使用 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 作为第三种状态可能值得商榷。也许枚举更合适?