SyntaxError:具有无效注释的语法无效

时间:2018-07-06 05:43:51

标签: python python-3.x visual-studio-code

我已经安装了Visual Studio代码和code runner扩展名。然后我有这段代码:

text: str = "slkdfjsd"

我点击CTRL-ALT-N并得到:

    text: str = "slkdfjsd"
        ^
SyntaxError: invalid syntax

我喜欢使用类型,并且该程序有效,它似乎在抱怨类型,我如何才能理解类型是可以的?

更多详细信息:

$ /usr/bin/env python3 --version
Python 3.6.6 :: Anaconda, Inc.

及其运行时:

[Running] /usr/bin/env python3 "/home/myuser/dev/projects/python-snippets/text-summarization"
  File "/home/myuser/dev/projects/python-snippets/text-summarization", line 44
    text: str = "slkdfjsd"
        ^
SyntaxError: invalid syntax

代码运行器插件文档说:

  

$pythonPath:Python解释器的路径(由Python: Select Interpreter command设置)

但是当我按照注释建议打印路径时,会得到一个不同的版本:

sys.version_info(major=3, minor=5, micro=2, releaselevel='final', serial=0)

与上面选择的>python: select interpreter不同,这与上面您看到的一样。

还请注意,当我在Visual Studio代码中使用终端而不是CTRL-ALT-N来运行此代码时,所选的python版本为3.6,并且运行良好,没有任何语法错误,因此我认为这与代码运行程序没有看到与选择>python: select interpreter

时看到的相同的python版本

更新:我确实看到代码运行器使用了如上所述的错误的python解释器,因此我打开了用户设置并尝试更新python以指向正确的解释器,但是它并没有改变任何内容。我仍然尝试使用相同的错误解释器:

{
    "git.autofetch": true,
    "terminal.integrated.rendererType": "dom",
    "code-runner.executorMap": {
        "javascript": "node",
        "java": "cd $dir && javac $fileName && java $fileNameWithoutExt",
        "c": "cd $dir && gcc $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
        "cpp": "cd $dir && g++ $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
        "objective-c": "cd $dir && gcc -framework Cocoa $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
        "php": "php",
        "python": "/home/user/home/user/dev/anaconda3/envs/pymachine/bin/python",
        "perl": "perl",
        "perl6": "perl6",
        "ruby": "ruby",
        "go": "go run",
        "lua": "lua",
        "groovy": "groovy",
        "powershell": "powershell -ExecutionPolicy ByPass -File",
        "bat": "cmd /c",
        "shellscript": "bash",
        "fsharp": "fsi",
        "csharp": "scriptcs",
        "vbscript": "cscript //Nologo",
        "typescript": "ts-node",
        "coffeescript": "coffee",
        "scala": "scala",
        "swift": "swift",
        "julia": "julia",
        "crystal": "crystal",
        "ocaml": "ocaml",
        "r": "Rscript",
        "applescript": "osascript",
        "clojure": "lein exec",
        "haxe": "haxe --cwd $dirWithoutTrailingSlash --run $fileNameWithoutExt",
        "rust": "cd $dir && rustc $fileName && $dir$fileNameWithoutExt",
        "racket": "racket",
        "ahk": "autohotkey",
        "autoit": "autoit3",
        "dart": "dart",
        "pascal": "cd $dir && fpc $fileName && $dir$fileNameWithoutExt",
        "d": "cd $dir && dmd $fileName && $dir$fileNameWithoutExt",
        "haskell": "runhaskell",
        "nim": "nim compile --verbosity:0 --hints:off --run"
      }
}

但是在更改了它之后(也许我在做错了什么,我是vscode新手),我仍然看到代码运行器正在使用以下命令运行它:

[Running] /usr/bin/env python3 "/home/myuser/dev/projects/python-snippets/text-summarization"

1 个答案:

答案 0 :(得分:4)

注意:以下答案假定您使用的是正确的版本(3.6+),如果不是,则:简单地,当前版本的Python不支持变量注释。


该问题似乎是类型注释导致#include <stdio.h> #include <stdlib.h> #include <string.h> #include <winsock2.h> #include <windows.h> #pragma comment(lib, "ws2_32.lib") #define MAXLINE 4096 SSIZE_T SendTizenPushServer() { // newtwork value char sendData[MAXLINE + 1], recvData[MAXLINE + 1], data[MAXLINE + 1]; SSIZE_T n; WSADATA wsaData; SOCKET fcmSocket; struct hostent *hostent; SOCKADDR_IN sockAddr; // samsung push server host name char *hname = "apkorea.push.samsungosp.com"; // network setting if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { printf("WSAStartup failed.\n"); return 0; } if ((hostent = gethostbyname(hname)) == NULL) { printf("gethostbyname error for host: %s:",hname); return 0; } fcmSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); if (fcmSocket == INVALID_SOCKET) { printf("Socket failed.\n"); return 0; } memset(&sockAddr, 0, sizeof(sockAddr)); sockAddr.sin_family = PF_INET; sockAddr.sin_addr.s_addr = inet_addr(inet_ntoa(*(struct in_addr*)*hostent->h_addr_list)); sockAddr.sin_port = htons(8090); if (connect(fcmSocket, (SOCKADDR*)&sockAddr, sizeof(sockAddr)) == SOCKET_ERROR) { printf("Connect failed.\n"); return 0; } sprintf(data, "{\"regID\":\"xxxMy_regIDxxx\"," "\"requestID\":\"00000001\"," "\"message\":\"alertMessage=Hi\"" "}\r\n"); sprintf(sendData, // Header "POST /spp/pns/api/push HTTP/1.1\r\n" "appID: xxxMy_appIDxxxx\r\n" "appSecret: xxxxMy_appSecretxxxx\r\n" "Host: %s:8090\r\n" "Content-Type: application/json\r\n" "Content-Length: %d\r\n\r\n" // Data "%s", hname, strlen(data), data); printf("send data : \n%s\n\n", sendData); send(fcmSocket, sendData, strlen(sendData), 0); while ((n = recv(fcmSocket, recvData, MAXLINE, 0)) > 0) { recvData[n] = '\0'; printf("recv : %s\n\n", recvData); } closesocket(fcmSocket); WSACleanup; return n; } 引起的,但另一个非常合理的可能性是前一行中有未封闭的括号或未封闭的内容。自docs起,它说:

  

解析器重复出现问题的行并显示一个小“箭头”   指向错误所在行中的最早点   检测到。该错误是由令牌引起的(或至少在令牌处检测到的)   在箭头之前

(重点是我的)

仅当给出在该上下文中无效的令牌时,解析器才能检测到未封闭的括号。由于方括号和括号可以跨越多行(这意味着不会引发EOL),并且SyntaxError是有效的变量标识符,因此仅在方括号或括号中不允许使用冒号(使用时除外)作为参数,它也接受类型注释。

这是tio.run(SE代码高尔夫编译器)上托管的代码的可复制示例:

https://tio.run/##K6gsycjPM/7/X4OrJLWixEqhuKRIwVZBXf3/fwA

text

( text: str = '' 是该上下文中的第一个无效令牌。

:

如果您有一个未封闭的dict,允许使用冒号,则箭头会指向其他位置,因为 File ".code.tio", line 2 text: str = '' ^ SyntaxError: invalid syntax 是所有有效的令牌,其开头为text: str。指针将指向等号,因为这是第一个无效令牌。

{

还有一个例外:

{
text: str = ''