【问题标题】:Using If not function(): to control flow in Python [closed]使用 If not function():在 Python 中控制流程 [关闭]
【发布时间】:2021-11-28 00:29:08
【问题描述】:

我有一个带有更新方法的对象类:这个方法只是做一些检查并更新对象的属性,不返回任何内容返回一个 Bool 以确定是否应该删除它。

其中一些检查结果会阻止其他检查结果的执行: 编辑,旧代码块:

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() 的结果通过返回一个 Bool 来确定 checkThree __updateIfExpired() 是否发生。

这写起来真的很不舒服,但这是我能想到的最清晰简洁的方式来获得我想要的行为。

这是不好的做法吗?我觉得它打破了“一个工具;一份工作”的规则。我还认为,由于过度的逻辑反转,这可能会使行为变得不清楚......

【问题讨论】:

  • “我觉得它打破了“一个工具;一份工作“规则” 为什么会这样? checkTwo 有一项工作(如果我们忽略它还会更改 y 的值作为副作用的事实),以决定某个条件是真还是假。恰好checkThree 的执行取决于该条件。对我来说看起来非常好。
  • 您的示例中没有 checkOnecheckThree 函数。您的代码不是有效的 python。你能包括minimal reproducible example吗?这是否是好的做法取决于您的用例。这看起来函数调用可能是 if else 语句
  • 这不是一个坏习惯!代码清晰,分区并按其意图执行。能有什么顾忌?
  • 这是否不好是不可能的,因为您选择删除实际逻辑并且只是显示无意义的检查。可能是您在自己的代码中过于复杂了,或者有一种更简洁易读的方式来编写它,但是如果不看上下文就不可能说出来。
  • @Grismar 感谢您的评论,我已经更新了帖子。

标签: python if-statement methods boolean control-flow


【解决方案1】:

我已经弄清楚为什么写这个感觉不对:

如果我们仔细观察 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

操作顺序对于获得预期行为至关重要:滑动缓冲区在跟踪窗口之外保留“标记”实体。

您是否应该使用 None 作为第三种状态可能值得怀疑。也许枚举会更合适?

【讨论】:

    猜你喜欢
    • 2011-02-12
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 2013-12-20
    • 2012-02-11
    • 1970-01-01
    相关资源
    最近更新 更多