为了账号安全,请及时绑定邮箱和手机立即绑定

使用 f-string 函数处理复杂字符串

使用 f-string 函数处理复杂字符串

繁星点点滴滴 2022-11-01 16:00:22
概述在这个简化的示例中,我有一个返回字符串的函数。该字符串最终将用于 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      }    }问题我不想在调用函数 ie 时双重换行文本'"test"'。f 弦中的嵌套花括号{{}}也不太理想。如何简化此功能并仍返回所需的输出?如果可以简化这一点,我很乐意使用 f-string 以外的另一种方法。
查看完整描述

4 回答

?
慕沐林林

TA贡献2016条经验 获得超9个赞

编辑 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)


查看完整回答
反对 回复 2022-11-01
?
绝地无双

TA贡献1946条经验 获得超4个赞

简化函数并使编写参数更容易的一种简单方法是简单地将参数的使用用引号括起来,这些参数在 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 字符串提供的相同便利。


查看完整回答
反对 回复 2022-11-01
?
慕桂英546537

TA贡献1848条经验 获得超10个赞

只是作为替代f-string,您可以使用str.format. 不过,您仍然必须保留嵌套的大括号。


query = """

mutation {{

  insert_post(objects: {{description: "{0}", url: "{1}", user_id: "{2}"}}) {{

    affected_rows

  }}

}}

"""


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


查看完整回答
反对 回复 2022-11-01
?
临摹微笑

TA贡献1982条经验 获得超2个赞

[1] - 由于您传递了 1,因此我假设“user_id”我们最初是一个 int。因此,如果需要,扔一件糖衣并将其转换为内部。


[2] - 显然你正试图在你的字符串中注入一个 JSON。基于此,我认为在字符串之外构建它并稍后注入它更容易。这将为以后更新代码提供更大的灵活性:


[3] - 代码更改后,我认为尝试使用插值“强制”模式毫无意义。它看起来干净而精简,但在这种情况下,我认为值得放弃它以支持简单的替换。它消除了额外{让您的模板更清晰易读的需要


import json



def updateHasura (description, url, user_id):

    if isinstance(user_id, int):  # [1]

        user_id = str(user_id)

    # [2]

    args = {

        'description': description,

        'url': url,

        'user_id': user_id,

        }

    args = json.dumps(args)

    query = '''

    mutation {

      insert_post(

        objects: args) {

        affected_rows

      }

    }

    '''

    return query.replace('args', args)  # [3]


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

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

[4] 如果你真的想进一步减少代码,你可以强制用户传递所有格式化的参数和各自的最终键名,并将kwargs直接拉到转储


import json



def updateHasura (**kwargs):  # 4

    query = '''

    mutation {

      insert_post(

        objects: args) {

        affected_rows

      }

    }

    '''

    return query.replace('args', json.dumps(kwargs))


print(updateHasura(description='test', url='test', user_id='1'))


查看完整回答
反对 回复 2022-11-01
  • 4 回答
  • 0 关注
  • 131 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号