4 回答

TA貢獻(xiàn)2016條經(jīng)驗(yàn) 獲得超9個(gè)贊
編輯 2
受Ramon Moraes回答的啟發(fā),我想出了另一個(gè)解決方案,這可能是一個(gè)很好的折衷方案:
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')
原始答案
要擺脫雙引號(hào),您可以簡(jiǎn)單地將引號(hào)放在 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')
只要您使用格式化的字符串,我看不出如何擺脫嵌套的大括號(hào)。
編輯
如果你真的不想嵌套大括號(hào),我想你可以這樣做,但我不推薦它:
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貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超4個(gè)贊
簡(jiǎn)化函數(shù)并使編寫(xiě)參數(shù)更容易的一種簡(jiǎn)單方法是簡(jiǎn)單地將參數(shù)的使用用引號(hào)括起來(lái),這些參數(shù)在 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')
這將提供相同的所需輸出,但不需要在參數(shù)中嵌套引號(hào)。
mutation {
insert_post(objects: {description: "test", url: "test", user_id: "1"}) {
affected_rows
}
}
不幸的是,如果不編寫(xiě)自己的函數(shù)來(lái)解析字符串本身,就無(wú)法在避免使用雙花括號(hào)的同時(shí)保持 f 字符串提供的相同便利。

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超10個(gè)贊
只是作為替代f-string,您可以使用str.format. 不過(guò),您仍然必須保留嵌套的大括號(hào)。
query = """
mutation {{
insert_post(objects: {{description: "{0}", url: "{1}", user_id: "{2}"}}) {{
affected_rows
}}
}}
"""
print(query.format("test", "test", "1"))

TA貢獻(xiàn)1982條經(jīng)驗(yàn) 獲得超2個(gè)贊
[1] - 由于您傳遞了 1,因此我假設(shè)“user_id”我們最初是一個(gè) int。因此,如果需要,扔一件糖衣并將其轉(zhuǎn)換為內(nèi)部。
[2] - 顯然你正試圖在你的字符串中注入一個(gè) JSON?;诖耍艺J(rèn)為在字符串之外構(gòu)建它并稍后注入它更容易。這將為以后更新代碼提供更大的靈活性:
[3] - 代碼更改后,我認(rèn)為嘗試使用插值“強(qiáng)制”模式毫無(wú)意義。它看起來(lái)干凈而精簡(jiǎn),但在這種情況下,我認(rèn)為值得放棄它以支持簡(jiǎn)單的替換。它消除了額外{讓您的模板更清晰易讀的需要
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] 如果你真的想進(jìn)一步減少代碼,你可以強(qiáng)制用戶傳遞所有格式化的參數(shù)和各自的最終鍵名,并將kwargs直接拉到轉(zhuǎn)儲(chǔ)
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'))
添加回答
舉報(bào)