gpt4 book ai didi

python - 在 Python 3 解释器模式下粘贴代码时出现 IndentationError

转载 作者:太空宇宙 更新时间:2023-11-03 12:14:05 25 4
gpt4 key购买 nike

当我运行以下代码时,它在函数内部有空行(没有空格),在解释器模式和 python3 split.py< 中逐行运行代码时,我得到了与 Python 3.6.5 不同的行为:

# File split.py

def find(s, start, predictor):
for i in range(start, len(s)):
if predictor(s[i]):
return i
return -1

def find_all(s, sep=" \t\n"):
beg_of_nonsep = 0
while beg_of_nonsep < len(s):
beg_of_nonsep = find(s, beg_of_nonsep, lambda ch, sep_chs=sep: ch not in sep_chs)
if beg_of_nonsep == -1:
break

end_of_nonsep = find(s, beg_of_nonsep + 1, lambda ch, sep_chs=sep: ch in sep_chs)
if end_of_nonsep == -1:
end_of_nonsep = len(s)

yield (beg_of_nonsep, end_of_nonsep)

beg_of_nonsep = end_of_nonsep + 1

split = lambda s: [s[beg: end] for (beg, end) in find_all(s)]

print(split(""))
print(split(" \t\n"))
print(split(" \tssss\n"))

在解释器模式下逐行运行代码时,python3 给了我严重的错误:

Type "help", "copyright", "credits" or "license" for more information.
>>> def find(s, start, predictor):
... for i in range(start, len(s)):
... if predictor(s[i]):
... return i
... return -1
...
>>> def find_all(s, sep=" \t\n"):
... beg_of_nonsep = 0
... while beg_of_nonsep < len(s):
... beg_of_nonsep = find(s, beg_of_nonsep, lambda ch, sep_chs=sep: ch not in sep_chs)
... if beg_of_nonsep == -1:
... break
...
>>> end_of_nonsep = find(s, beg_of_nonsep + 1, lambda ch, sep_chs=sep: ch in sep_chs)
File "<stdin>", line 1
end_of_nonsep = find(s, beg_of_nonsep + 1, lambda ch, sep_chs=sep: ch in sep_chs)
^
IndentationError: unexpected indent
>>> if end_of_nonsep == -1:
File "<stdin>", line 1
if end_of_nonsep == -1:
^
IndentationError: unexpected indent
>>> end_of_nonsep = len(s)
File "<stdin>", line 1
end_of_nonsep = len(s)
^
IndentationError: unexpected indent
>>>
>>> yield (beg_of_nonsep, end_of_nonsep)
File "<stdin>", line 1
yield (beg_of_nonsep, end_of_nonsep)
^
IndentationError: unexpected indent
>>>
>>> beg_of_nonsep = end_of_nonsep + 1
File "<stdin>", line 1
beg_of_nonsep = end_of_nonsep + 1
^
IndentationError: unexpected indent
>>>
>>> split = lambda s: [s[beg: end] for (beg, end) in find_all(s)]
>>>
>>> print(split(""))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <lambda>
TypeError: 'NoneType' object is not iterable
>>> print(split(" \t\n"))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <lambda>
TypeError: 'NoneType' object is not iterable
>>> print(split(" \tssss\n"))



最后的 print 永远不会退出,直到我使用 ctrlc 停止它。

因此,我认为我的代码有很多错误。

但是,当我用 python3 split.py 运行代码时,这一切都没有发生:

[]
[]
['ssss']

这让我很困惑。

明确地说,我实际上使用的是 vimcmdline在带有 vim 8.1 的 Debian 9.8 上。

我还通过 pymode 使用 pylint,它拆分了任何尾随空格,它认为这是多余的。

当我尝试使用它的内置键绑定(bind)将 split.py 发送到打开的 tmux 拆分中的 python3 时,发生了这个问题。

我已经填写了一个 issue ,但我忍不住想知道为什么 python3 会这样。

最佳答案

这种行为对我来说并不奇怪。

Python 使用缩进来确定代码块的开始和结束。逻辑上缩进结束于第一行没有缩进。运行脚本时,空行将被忽略。当运行脚本时,这意味着缩进要么以未缩进的行结束,要么以文件结尾结束。

但是这种行为不能在命令行模式下工作,因为没有文件结尾。考虑以下脚本文件:

from somewhere import bar, do_something

for foo in bar:
do_something(foo)

在脚本中,文件末尾表示它现在应该运行 for 循环。它知道没有更多的执行。但是在命令行模式下,命令行还是开着的,还是可以多写的。它不知道您的下一行代码是在 for 循环内部还是外部。但是命令行不能坐等你的下一行代码……你想让它执行……现在!

因此命令行操作有一个特定的区别。一个空行也将结束一个代码块。所以这很好:

from somewhere import bar, do_something, do_something_else

for foo in bar:
do_something(foo)
do_something_else(foo)

但这是一个错误:

from somewhere import bar, do_something, do_something_else

for foo in bar:
do_something(foo)

do_something_else(foo)

因为你已经用一个空行结束了for循环,不能再往里面加了。

关于python - 在 Python 3 解释器模式下粘贴代码时出现 IndentationError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55792377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com