Python3中使用F-strings时出现无效的格式说明符

6

我有一个小脚本,尝试在一个post请求的字符串中嵌入字符串变量。 我遇到的问题是,当我使用f-string格式化时,会出现以下错误。

richard@kali:~/Dropbox/offsec/Code/5_Bassmaster$ ./bassmaster.py 192.168.1.101
Traceback (most recent call last):
  File "./bassmaster.py", line 15, in <module>
    json = f'{"requests": [{request_1}, {request_2}, {request_3}]}'
ValueError: Invalid format specifier

这是我的代码。据我所知,它应该嵌入这些字符串,但是我无法消除错误。我尝试使用^字符,如此处建议的那样,但它并没有解决问题。
#!/usr/bin/python3

import requests,sys

if len(sys.argv) != 2:
    print(f"(+) usage: {sys.argv[0]} <target>") 
    sys.exit(-1)

target = f"http://{sys.argv[1]}:8080/batch"

request_1 = '{"method":"get","path":"/profile"}' 
request_2 = '{"method":"get","path":"/item"}' 
request_3 = '{"method":"get","path":"/item/$1.id"}'

json = f'{"requests": [{request_1}, {request_2}, {request_3}]}'
r = requests.post(target, json)

print(r.text)

4
在f-string中要转义左花括号 {,需要写成两个连续的花括号 {{ - AChampion
2个回答

8

尝试:

json = f'"requests": [{request_1}, {request_2}, {request_3}]'
json="{"+json+"}"

不要使用json = f"..."这一行。

问题在于最外层的括号。F-string不知道如何处理双重括号 - 因此你需要使其以一种方式工作,即只有单个花括号打开和关闭,而没有其他东西包围它们...


1

使用json dumps:

#!/usr/bin/python3
import json
import requests
import sys

if len(sys.argv) != 2:
    print(f"(+) usage: {sys.argv[0]} <target>")
    sys.exit(-1)

r = requests.post(
    f"http://{sys.argv[1]}:8080/batch",
    json.dumps(
        {
            "requests": [
                {"method": "get", "path": "/profile"},
                {"method": "get", "path": "/item"},
                {"method": "get", "path": "/item/$1.id"},
            ]
        }
    ),
)

print(r.text)

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