这个简单的Python列表语法有什么问题?

8
也许我在 Python 方面有些生疏了。为什么将此内容粘贴到 Python shell 中时会被拒绝?
hdr_filenames = [
    "20210311_105300_HDR.jpg",
    "20210311_105306_HDR.jpg",
    "20210311_105310_HDR.jpg",
    "20210311_105314_HDR.jpg",
    "20210311_105341_HDR.jpg",    # order of last two have reversed exposures   
    "20210311_105323_HDR.jpg"
    ]

当这段代码被复制到运行Python3的xterm终端中时,我得到了以下输出(请忽略古老的术语):

enter image description here

注:很傻的是我忘记报告一些基本显而易见的信息:这是Python 3.9.1版本,在大约一个月前更新的Arch Linux上运行。

5
对我来说运作良好,看起来你可能混入了奇怪的字符或其他东西?尝试从你在 Stack Overflow 上发布的版本中复制/粘贴。 - Masklinn
1
对我来说可以运行...我无法重现。我将其复制并粘贴到我的REPL中,没有任何问题,我在OSx上使用iterm2...也许与特定的xterm有关? - juanpa.arrivillaga
我也可以重现这个问题。如果我将第一个字符串移动到第一行,在 [ 之后,问题就消失了。另一件奇怪的事情是...如果我将示例分成两个部分进行复制/粘贴,首先只粘贴第一行,然后再粘贴表达式的其余部分,问题也会消失。我和 @juanpa.arrivillaga 的设置类似,所以奇怪的是我能够重现这个问题而他们却不能。 - CryptoFool
能够重现问题的人,请告诉我们您正在使用哪个终端? - juanpa.arrivillaga
1
可以确认,在我的OSX,iterm2上发生了Python 3.9.1的问题! - juanpa.arrivillaga
显示剩余11条评论
2个回答

11

所以,我这里没有一个完整的答案,但这与在Python 3.9中首次亮相的新PEG解析器有关,因为当我使用它时(它是Python 3.9上的默认解析器),我会得到同样的错误:

Python 3.9.1 (default, Dec 11 2020, 06:28:49)
[Clang 10.0.0 ] :: Anaconda, Inc. on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> hdr_filenames = [
    "20210311_105300_HDR.jpg",
    "20210311_105306_HDR.jpg",
    "20210311_105310_HDR.jpg",
    "20210311_105314_HDR.jpg",
    "20210311_105341_HDR.jpg",    # order of last two have reversed exposures
    "20210311_105323_HDR.jpg"
    ]
  File "<stdin>", line 1
        ]
         ^
SyntaxError: multiple statements found while compiling a single statement

但是你可以通过传递一个命令行选项来恢复到旧的LL(1)解析器,然后就不会出错了:

但是您可以通过传递命令行选项来恢复旧的LL(1)解析器,然后,哇!无错误:

(py39) juanarrivillaga@50-254-139-253-static % python -X oldparser
Python 3.9.1 (default, Dec 11 2020, 06:28:49)
[Clang 10.0.0 ] :: Anaconda, Inc. on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> hdr_filenames = [
    "20210311_105300_HDR.jpg",
    "20210311_105306_HDR.jpg",
    "20210311_105310_HDR.jpg",
    "20210311_105314_HDR.jpg",
    "20210311_105341_HDR.jpg",    # order of last two have reversed exposures
    "20210311_105323_HDR.jpg"
    ]
>>> exit()

对于那些感兴趣的人,有关新解析器的相关PEP 617

编辑

因此,在Python 3.9.2上(我相信目前是最新版本),这似乎不再是一个问题。因此,也许可以升级?

Python 3.9.2 (default, Mar  3 2021, 11:58:52)
[Clang 10.0.0 ] :: Anaconda, Inc. on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> hdr_filenames = [
...     "20210311_105300_HDR.jpg",
...     "20210311_105306_HDR.jpg",
...     "20210311_105310_HDR.jpg",
...     "20210311_105314_HDR.jpg",
...     "20210311_105341_HDR.jpg",    # order of last two have reversed exposures
...     "20210311_105323_HDR.jpg"
...     ]
>>>

2
哇,伙计。你的侦探技能真是厉害。我对你的知识印象深刻。我对PEG vs LL(1) vs 纸笔算法一无所知。太棒了。实际上...我认为这是一个相当完整的答案。我觉得期望你找到具体有问题的代码行是不合理的,哈哈。你还能做什么呢? - CryptoFool
@CryptoFool 我对计算机科学这样的主题没有深入的了解,相对较晚地进入了编程/软件工程领域,但我确实会跟上Python版本发布中的新功能,并记得看到这个变化时想到“很棒,希望我能更加深入地理解它”。我只是凭直觉尝试了一下。 - juanpa.arrivillaga
@Manuel - 很有趣。关于终端的事情在Windows和Mac以及Linux上通常是不同的,所以我并不感到太惊讶。我敢打赌这种情况会发生在Linux上。- 更新:也许不会。我刚刚在docker run -it python:3.9下尝试了一下,对我来说没有发生这种情况。 - CryptoFool
2
你的错误与 OP 的截图略有不同,在 ^ 上面有一行空行。 - Manuel
1
这个操作可以解决问题:echo "set enable-bracketed-paste off" >> ~/.inputrc - DarenW
显示剩余9条评论

-3

是的,也许只需要升级一下。我也遇到过这个问题,对我来说问题在于解释器错误,教程解决了这个问题。 这里是链接,也许它能像帮助我一样帮助你: https://youtu.be/RvbUqf3Tb1s The Fix


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接