使用fstring函数处理复杂字符串

2024-10-03 21:35:10 发布

您现在位置:Python中文网/ 问答频道 /正文

概述

在这个简化的示例中,我有一个返回字符串的函数。字符串最终将用于GraphQL变异

def updateHasura (description,url,user_id):    

    query = f"""
    mutation {{
      insert_post(objects: {{description: {description}, url: {url}, user_id: {user_id}}}) {{
        affected_rows
      }}
    }}
    """
    print(query)

当我调用函数时,我需要用单引号将双引号括起来,以便函数返回所需的字符串

updateHasura('"test"','"test"','"1"')

提供所需的输出:

mutation {
      insert_post(objects: {description: "test", url: "test", user_id: "1"}) {
        affected_rows
      }
    }

问题

我不想在调用函数时双重包装文本,即'"test"'

f字符串中嵌套的花括号{{}}也不太理想

如何简化此函数并仍然返回所需的输出?我很乐意使用f字符串以外的另一种方法,如果它可以简化这一点的话


Tags: 函数字符串testidurlobjectsdescriptionquery
3条回答

编辑2

Ramon Moraes答案的启发,我提出了另一个解决方案,这可能是一个很好的折衷方案:

def updateHasura(description, url, user_id):
    args = f'description: "{description}", url: "{url}", user_id: "{user_id}"'
    query = """
    mutation {
      insert_post(objects: args) {
        affected_rows
      }
    }
    """.replace('args', args)
    print(query)


updateHasura('test', 'test', '1')

原始答案

要消除双引号,只需在f字符串中添加引号,如下所示:

def updateHasura(description, url, user_id):

    query = f"""
    mutation {{
      insert_post(objects: {{description: "{description}", url: "{url}", user_id: "{user_id}"}}) {{
        affected_rows
      }}
    }}
    """
    print(query)

updateHasura('test', 'test', '1')

我不知道如何摆脱嵌套的花括号,但只要您使用的是格式化字符串

编辑

如果你真的不想有嵌套的花括号,我想你可以这样做,但我不推荐:

    query = """
    mutation {
      insert_post(objects: {description: "{""" + description + """}", url: "{"""  + url + """}", user_id: "{""" + user_id + """}"}) {
        affected_rows
      }
    }
    """

    query = """
    mutation {
      insert_post(objects: {description: "%s", url: "%s", user_id: "%s"}) {
        affected_rows
      }
    }
    """ % (description, url, user_id)

简化函数并使编写参数更容易的一种简单方法是,在f字符串中使用参数的地方,简单地用引号括起参数的用法

def updateHasura (description, url, user_id):
  query = f"""
  mutation {{
    insert_post(objects: {{description: "{description}", url: "{url}", user_id: "{user_id}"}}) {{
      affected_rows
    }}
  }}
  """
  print(query)

updateHasura('test','test','1')

这将提供相同的所需输出,但不需要在参数中使用嵌套引号

mutation {
  insert_post(objects: {description: "test", url: "test", user_id: "1"}) {
    affected_rows
  }
}

不幸的是,如果不编写自己的函数来解析字符串本身,就无法保持f字符串提供的便利性,同时避免使用折叠大括号

作为f-string的替代方法,您可以使用str.format。不过,您仍然需要保留嵌套的花括号

query = """
mutation {{
  insert_post(objects: {{description: "{0}", url: "{1}", user_id: "{2}"}}) {{
    affected_rows
  }}
}}
"""

print(query.format("test", "test", "1"))

相关问题 更多 >