在函数中将参数传递给字符串 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)