在函数中将参数传递给字符串 json
pass parameters to a string json within a function
如果我 运行 一个 post 这样的请求,它会起作用:
def myFunction():
contentTypeHeader = {
'Content-type': 'application/json',
}
data = """
{
"target": {
"ref_type": "branch",
"type": "pipeline_ref_target",
"ref_name": "master",
"selector": {
"type": "custom",
"pattern" : "mypipeline"
}
},
"variables": []
}
"""
http = urllib3.PoolManager()
headers = urllib3.make_headers(basic_auth='{}:{}'.format("username", "password"))
headers = dict(list(contentTypeHeader .items()) + list(headers.items()))
try:
resp = http.urlopen('POST', 'https://api.bitbucket.org/2.0/repositories/owner/slugg/pipelines/', headers=headers, body=data)
print('Response', str(resp.data))
except Exception as e:
print('Error', e)
myFunction()
但是,如果我不对值进行硬编码,而是尝试将它们作为函数传递:
def myFunction(bitbucket_branch, pipeline_name):
contentTypeHeader = {
'Content-type': 'application/json',
}
data = """
{
"target": {
"ref_type": "branch",
"type": "pipeline_ref_target",
"ref_name": "${bitbucket_branch}",
"selector": {
"type": "custom",
"pattern" : "${pipeline_name}"
}
},
"variables": []
}
"""
...
myFunction("master","mypipeline")
我收到这个错误:
Response b'{"error": {"message": "Not found", "detail": "Could not find last reference for branch ${bitbucket_branch}", "data": {"key": "result-service.pipeline.reference-not-found", "arguments": {"uuid": "${bitbucket_branch}"}}}}'
此外,在我的函数中:
def myFunction(bitbucket_branch, pipeline_name):
参数在我的 VSCode 中仍然是浅色,这表明参数实际上并没有在函数中使用。
也许我在编码字符串时做错了什么,但无法弄清楚到底是什么。
Python 不会为您在字符串中扩展 ${pipeline_name}
;这是 Javascript 模板字符串的一个特性(不是 JSON 的一部分)- 所以除非你 运行 实际 Javascript,否则这是行不通的。
然而,python 有 f-strings,其作用相同:
def myFunction(bitbucket_branch, pipeline_name):
contentTypeHeader = {
'Content-type': 'application/json',
}
# notice the added f and removal of $
data = f"""
{
"target": {
"ref_type": "branch",
"type": "pipeline_ref_target",
"ref_name": "{bitbucket_branch}",
"selector": {
"type": "custom",
"pattern" : "{pipeline_name}"
}
},
"variables": []
}
"""
这会将字符串中 {}
中的内容替换为变量中的值。我还想提一下,您可能希望将其声明为 Python 结构,并使用 json.dumps
将其转换为 JSON。这样你就可以在 Python 中做任何你习惯的事情,而不是使用 JSON 模板并替换该模板中的值(如果这些值中的任何一个包含 "
,你将在这种情况下最终会生成无效的 JSON。
import json
def myFunction(bitbucket_branch, pipeline_name):
data = {
"target": {
"ref_type": "branch",
"type": "pipeline_ref_target",
"ref_name": bitbucket_branch,
"selector": {
"type": "custom",
"pattern" : pipeline_name
}
},
"variables": []
}
}
return json.dumps(data)
如果我 运行 一个 post 这样的请求,它会起作用:
def myFunction():
contentTypeHeader = {
'Content-type': 'application/json',
}
data = """
{
"target": {
"ref_type": "branch",
"type": "pipeline_ref_target",
"ref_name": "master",
"selector": {
"type": "custom",
"pattern" : "mypipeline"
}
},
"variables": []
}
"""
http = urllib3.PoolManager()
headers = urllib3.make_headers(basic_auth='{}:{}'.format("username", "password"))
headers = dict(list(contentTypeHeader .items()) + list(headers.items()))
try:
resp = http.urlopen('POST', 'https://api.bitbucket.org/2.0/repositories/owner/slugg/pipelines/', headers=headers, body=data)
print('Response', str(resp.data))
except Exception as e:
print('Error', e)
myFunction()
但是,如果我不对值进行硬编码,而是尝试将它们作为函数传递:
def myFunction(bitbucket_branch, pipeline_name):
contentTypeHeader = {
'Content-type': 'application/json',
}
data = """
{
"target": {
"ref_type": "branch",
"type": "pipeline_ref_target",
"ref_name": "${bitbucket_branch}",
"selector": {
"type": "custom",
"pattern" : "${pipeline_name}"
}
},
"variables": []
}
"""
...
myFunction("master","mypipeline")
我收到这个错误:
Response b'{"error": {"message": "Not found", "detail": "Could not find last reference for branch ${bitbucket_branch}", "data": {"key": "result-service.pipeline.reference-not-found", "arguments": {"uuid": "${bitbucket_branch}"}}}}'
此外,在我的函数中:
def myFunction(bitbucket_branch, pipeline_name):
参数在我的 VSCode 中仍然是浅色,这表明参数实际上并没有在函数中使用。
也许我在编码字符串时做错了什么,但无法弄清楚到底是什么。
Python 不会为您在字符串中扩展 ${pipeline_name}
;这是 Javascript 模板字符串的一个特性(不是 JSON 的一部分)- 所以除非你 运行 实际 Javascript,否则这是行不通的。
然而,python 有 f-strings,其作用相同:
def myFunction(bitbucket_branch, pipeline_name):
contentTypeHeader = {
'Content-type': 'application/json',
}
# notice the added f and removal of $
data = f"""
{
"target": {
"ref_type": "branch",
"type": "pipeline_ref_target",
"ref_name": "{bitbucket_branch}",
"selector": {
"type": "custom",
"pattern" : "{pipeline_name}"
}
},
"variables": []
}
"""
这会将字符串中 {}
中的内容替换为变量中的值。我还想提一下,您可能希望将其声明为 Python 结构,并使用 json.dumps
将其转换为 JSON。这样你就可以在 Python 中做任何你习惯的事情,而不是使用 JSON 模板并替换该模板中的值(如果这些值中的任何一个包含 "
,你将在这种情况下最终会生成无效的 JSON。
import json
def myFunction(bitbucket_branch, pipeline_name):
data = {
"target": {
"ref_type": "branch",
"type": "pipeline_ref_target",
"ref_name": bitbucket_branch,
"selector": {
"type": "custom",
"pattern" : pipeline_name
}
},
"variables": []
}
}
return json.dumps(data)