首页 > 解决方案 > 缩进问题 Pycharm

问题描述

我是编码和 python 的新手,所以我正在做一个在线免费课程。我应该做的一项任务不能正常工作,显然问题是身份识别。这是代码:

c = 0
while c < 5:
    c += 1
    if c == 3:
        continue
        print (c)

所以最后一行与前一行对齐,只有在我从最后一行删除一个标识后,代码才能正常运行。如何将其配置为自动,这样我就不必一直删除它?

标签: pythonpycharm

解决方案


TLDR:一般来说,不,您不能自动配置它。但是,在某些特定情况下,我们可以在 linter 的帮助下说语句肯定在错误的范围内。但是,即使在 linter 的帮助下,程序员仍然有责任实际纠正程序。

一般情况:

没有一种编程语言可以知道您希望语句处于什么范围内。那是由您,程序员,用语言表达的。Python 的作用域恰好由空格决定,而不是花括号,就像在其他一些流行语言(即 C/C++/Java/Perl)中一样。

考虑:

if x:
    do_y()
    do_z()

对比

if x:
    do_y()
do_z()

两者都是合法的 Python 程序,并且都(可能)在逻辑上是正确的,具体取决于应用程序。也许您只想调用do_z()ifx为真(第一个示例)。或者也许你总是想打电话do_z()不管x(第二个例子)。只有应用程序开发人员可以决定他们想要哪个。您想要的实际上可能会随着时间的推移而改变,具体取决于具体情况。所以应该很清楚,这个决定(一般来说)不能自动做出。

使用 pylint:

但是,有时我们可以说某些语句肯定在错误的范围内(例如在上面的示例中,continue永远无法到达紧接在 a 之后的语句)。

您可以使用 linter (like pylint) 来帮助解决这个问题:

test.py我已经放置了你的问题代码并给了它一个快速的 pylint:

(so) URSA-MattM-MacBook:stackoverflow mmessersmith$ cat test.py
c = 0
while c < 5:
    c += 1
    if c == 3:
        continue
        print(c)
(so) URSA-MattM-MacBook:stackoverflow mmessersmith$ pylint test.py
************* Module test
test.py:1:0: C0111: Missing module docstring (missing-docstring)
test.py:1:0: C0103: Constant name "c" doesn't conform to UPPER_CASE naming style (invalid-name)
test.py:6:8: W0101: Unreachable code (unreachable)

------------------------------------------------------------------
Your code has been rated at 5.00/10 (previous run: 5.00/10, +0.00)

请注意这一行:test.py:6:8: W0101: Unreachable code (unreachable). 这告诉你第 6 行永远不会被执行,无论程序状态如何。

此外,请注意,任何 linter 仍然无法自动更正缩进。print(c)语句应该缩进的地方有两种合法的可能性:

c = 0
while c < 5:
    c += 1
    if c == 3:
        continue
    print (c)

c = 0
while c < 5:
    c += 1
    if c == 3:
        continue
print (c)

两者都是合法(且合理)的 Python 程序!第一个将c在 while 循环的每次迭代中打印,第二个将仅c在循环完成后打印。只有你,程序员,可以决定你喜欢哪一个。所有 linter 可以说的是“您几乎可以肯定并不是要在 a 之后立即放置一条语句continue,因为该代码永远不会被执行”。

同样,这取决于您想要声明的位置。没有自动化工具可以自动为您放置语句,因为它不可能知道您想要完成什么。


推荐阅读