【问题标题】:Calling a function between quotation marks在引号之间调用函数
【发布时间】:2018-09-05 23:16:38
【问题描述】:

我是编程初学者,目前正在尝试在引号之间调用函数。

在这里,更准确地说,我想用 88 替换 \"name\": \"name\" 中的名称。我怎样才能用所有这些引号来做到这一点?

提前感谢您的帮助

import requests

url = "https://api.multiloginapp.com/v1/profile/create"

def descr():
    return 88

querystring = {"token":"xxxx"}

payload = "{\n\t\"generateZeroFingerprintsData\": true,\n    \"name\": \"name\",\n    \"OS\": \"MacOS\",\n    \"platform\": \"MacIntel\",\n    \"browserType\": \"mimic\",\n    \"proxyHost\": \"0.0.0.0\",\n    \"proxyPort\": 0,\n    \"proxyIpValidation\": false,\n    \"proxyType\": \"socks5\",\n    \"maskFonts\": true,\n    \"disablePlugins\": true,\n    \"disableWebrtcPlugin\": true,\n    \"disableFlashPlugin\": true,\n    \"canvasDefType\": \"noise\",\n    \"hardwareConcurrency\": 2,\n    \"langHdr\": \"en-US,en;q=0.8\",\n    \"timeZone\": \"US/Eastern\",\n    \"audio\": {\n        \"noise\": true\n    },\n    \"geolocation\": {\n        \"permitType\": \"block\"\n    },\n    \"mediaDevices\": {\n        \"audioInputs\": 1,\n        \"audioOutputs\": 1,\n        \"videoInputs\": 1\n    },\n    \"webgl\": {\n        \"noise\": true\n    },\n    \"webRtc\": {\n        \"type\": \"block\"\n    },\n    \"shared\": false\n\t},\n}"
headers = {
    'Content-Type': "application/json",
    'Cache-Control': "no-cache",
    'Postman-Token': "xxx
    }

response = requests.request("POST", url, data=payload, headers=headers, params=querystring)

print(response.text)

【问题讨论】:

  • 首先,您似乎正在尝试生成一些 JSON。如果是这样,为什么不直接创建一个普通的字典,这很容易,然后调用json.dumps 呢?或者,更好的是,只需将 dict 传递给 requests.post(url, json=payload, headers=headers)?
  • 我建议使用 json 内置库将 payload 转换为 Python 字典,然后更改 name 键。

标签: python function api


【解决方案1】:

执行您在此处直接询问如何操作的方法是使用字符串格式。例如,using printf-style formatting,1 而不是这个:

payload = " … \"name\": \"name\" … "

……这样做:

template = " … \"name\": \"%s\" … "
payload = template % (descr(),)

当我们这样做时,如果您将有效负载放在单引号中,您就不需要转义每个"。更好的是,如果你把它放在三引号中,你就不需要转义所有的换行符。详情见the tutorial section on Strings

template = """{
    \t"generateZeroFingerprintsData": true,
    \t"name": "%s",
    # …
}"""

但是你可以通过不做任何事情来让事情变得更容易。您正在尝试构建一个表示字典的 JSON 文本。最简单的方法是just create the dictionary and JSON-ify it:

payloadobj = {
    "generateZeroFingerprintsData": True,
    "name": descr(),
    # …
}
payload = json.dumps(payloadobj)

或者,更好的是,让requests 为您做这件事。 Instead of passing data= with a string, pass it json= with a dict, and it automatically JSON-ifies it, and also sets the Content-Type header for you:

payload = {
    "generateZeroFingerprintsData": True,
    "name": name,
    # …
}
# …

response = requests.post(url, json=payload, headers=headers, params=querystring)

(另外,请注意,我使用了更简单的post 函数as shown in the quickstart docs,而不是调用通用的request 函数并传递POST,你真的只想为custom HTTP verbs that requests doesn't know about 做。)


1。一般来说,较新的基于大括号的格式更简单。尤其是在 3.6+ 中,您可以在引号内调用函数,只需将其包裹在 f 字符串中的大括号中,例如 `spam = f'eggs = {eggs()}'。但是,当您尝试创建的字符串充满了文字大括号,但没有充满文字百分比字符时,这通常是“一般”之外的例外。

【讨论】:

  • 非常感谢,它运行良好。让请求完成这项工作的任何充分理由?我创建了一本字典,您的更好选择似乎几乎相同
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 2015-06-22
  • 1970-01-01
  • 2011-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多