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)

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 字符串提供的相同便利。

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"))

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'))
添加回答
举报