Python缩进失败?

2024-10-01 19:33:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试着为我一直在做的一个小程序写一个类,结果我遇到了一个奇怪的缩进失败。我想知道我写的东西是否真的有问题,或者是解析器的错。这在Fedora15的Python3.2包中失败。你知道吗

  def __getitem__(self, key):
    if CharacterStats.usesSubStats:
      if key in self.subStats:
        return self.subStats[key]
    elif key in self.stats: #change this to 'if' and it works
      return self.stats[key]
    else:
      raise KeyError(key)
    #otherwise we end up right here.

按要求运行:http://pastebin.com/d8yQUm3U


Tags: keyinself程序解析器returnifdef
3条回答

当且仅当CharacterStats.usesSubStats为真且key in self.subStats为假时,您可以结束在标记为otherwise we end up right here的行上。你知道吗

当您将elif更改为if时,就消除了这种可能性:代码永远无法到达otherwise we end up right here行。你知道吗

很难说这两个版本中哪一个是正确的。如果我猜对了你的意图,也许下面的两种方法都会更清楚:

  def __getitem__(self, key):
    if CharacterStats.usesSubStats:
        if key in self.subStats:
            return self.subStats[key]
    elif key in self.stats:
        return self.stats[key]
    raise KeyError(key)

如果你想正确地理解错误 usesSubStats为True,并且key不在subStats中,或者如果usesSubStats为 False和key不在stats中。所以我认为问题是 如果/elif/else链接不能像您认为的那样工作。你知道吗

考虑:

def f(x):
    if x == 1:
        return 'first'
    elif x == 2:
        return 'second'
    else:
        return 'other'

产生

>>> f(1), f(2), f(3), f(4)
('first', 'second', 'other', 'other')

我希望它能达到预期的效果,这是你应该记住的模式。因为在测试代码中useSubStats为True,所以只测试第一个分支:

def condition(lab, val):
    print('testing condition', lab);
    return val

def g():
    if condition(1, True):
        return 'first branch'
    elif condition(2, False):
        return 'second branch'
    else:
        return 'other branch'
    return 'fallthrough'


>>> g()
testing condition 1
'first branch'

所以你的代码是这样的:

def h():
    if condition(1, True):
        if condition('1b', False):
            return 'first branch'
    elif condition(2, False):
        return 'second branch'
    else:
        return 'other branch'
    return 'fallthrough'

>>> h()
testing condition 1
testing condition 1b
'fallthrough'

我不太确定你认为它应该如何表现,但似乎你期望在“如果”键输入之后自身子状态“测试失败,执行应该移回if/elif/else分支的下一个成员上一级并测试它。不过,这根本不是它的工作原理。你知道吗

有几种简单的方法可以得到你想要的行为:一种是把它展平,这样它就可以

    if CharacterStats.usesSubStats and key in self.subStats:

相反,它的计算结果将为False,因此下一个分支进行测试,或者——正如您自己发现的那样——使elif成为if,这再次导致该条件被独立测试,或者像前面的答案一样重写。你知道吗

这有道理吗?if/elif/else列表描述了一系列的可能性,条件按顺序测试,并且只执行与第一个真条件相对应的分支(将最后的else作为'elif 1:')。根据分支中发生的情况,不能移动到下一个分支。你知道吗

我认为你应该用raise缩进#otherwise..,因为后者在一个最终的else中,而且“外部块”永远不会到达。。因此,我认为这是一个合理的压痕误差。你知道吗

相关问题 更多 >

    热门问题