这是有道理的,它的作品,因为像这样的语句:
'some value goes here %s' % value
实际上返回一个字符串。这可能更符合逻辑了一下,查看它是这样的:
result = ("%s limit 1" % sql) % table
没有什么明确错这样做的,但链运营商可能会导致问题,首先要弄清楚从哪里传来一个错误。
因此,举例来说,这工作得很好:
>>> sql = 'a value of %s'
>>> x = 'some string %s with stuff'
>>> y = 'VALUE'
>>> x % sql % y
'some string a value of VALUE with stuff'
但如果是有一个格式错误(我认识到这一点的例子是病理性的,但它横跨得到点):
>>> sql = 'a value of %d'
>>> x = 'some string %d with stuff'
>>> y = 123
>>> x % sql % y
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: %d format: a number is required, not str
真的不清楚哪个%d
导致您的错误。出于这个原因,如果可能的话,我会把它分开,每行只使用一个%
格式化程序,因为那么追溯程序将能够指出你到底是哪一行以及哪一个格式化程序存在问题。
对于记录来说,通过每行创建一个格式化程序,您还可以让任何需要阅读代码并尝试弄清楚发生了什么的人都轻松得多。
def get_sql(table,limit=True):
sql = "select report_date from %s"%table
if limit: sql += " limit 1"
return sql
PS:
'--':错误的解释,这与多个参数无关,关联性错误。尝试使用'“%ss limit 1'%'%'%'BOO'来查看我的意思,这个表达式可以工作,只要我们按照您的建议放置括号,''%ss limit 1'%('%'%( 'BOO'))'中断/错误。此外,您提出的修补程序并不比原来的 – 2010-07-17 05:19:32
好,我认为您误解了。我并不是说这与单数或多重的论点有什么关系,只是如果你从使用单数转换为元组,这将变得更加清楚,这是一个合法的事情。你的反例是错的 - ('%'%('BOO'))无效。 ''%s limit 1'%'%s'%'BOO''对''%s限制1“%('%s'%('BOO'))'。两者都有效。请注意,问题不包含您的示例需要的'%ss'格式。这不是一个'建议的修复' - 原始代码没有问题,它只是一个建议的修改。 – pycruft 2010-07-17 23:36:06
似乎你不明白。 (A)按照您所做的方式放置括号会更改操作**的顺序。当你有类型'A%B%C'的表达时,它被执行为'(A%B)%C',而不是'A%(B%C)',因为你的第一套参数迫使它。 (B)另外,你的理解是把表达式放在表达式之外使得元组不正确是错误的 - 事实并非如此。为了强制元组,你必须明确地使用构造函数tuple(),或者使用“愚蠢的逗号”,比如''%s limit 1“%(sql%(table,),)' - 这会创建元组,你的例子仍然是错的,因为(A) – 2010-07-18 07:20:29