Это имеет смысл, что это работает, потому что утверждение, как это:
'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
вызывает вашу ошибку. По этой причине я бы разделил его и просто использовал один форматир %
на строку, если это возможно, потому что тогда трассировка сможет указать вам точно, в какой строке и с какой форматирующей проблемой возникла проблема.
Для справки, сделав это одним форматированием на строку, вы также облегчите жизнь другим, кто должен прочитать ваш код и попытаться выяснить, что происходит.
'-': Неправильное объяснение, это не имеет ничего общего с несколькими аргументами, и ассоциативность неверна. Попробуйте ''% ss limit 1 "% '%'% 'BOO'', чтобы увидеть, что я имею в виду, это выражение работает, всякий раз, когда мы помещаем скобки, как вы предлагаете,' '% ss limit 1"% ('% '% ('BOO')) 'breaks/error. Кроме того, ваше предлагаемое исправление не лучше оригинала –
Я думаю, вы неправильно поняли. Я не предполагал, что это имело какое-либо отношение к сингулярности или множественности аргументов, просто если бы вы перешли от использования синглов к кортежам, стало бы более ясно, что это законная вещь. Ваш встречный пример неверен - ('%'% ('BOO')) недействителен. '"% s limit 1 "% '% s'% 'BOO'' против' '% s limit 1"% ('% s '% (' BOO ')) '. Оба работают. Обратите внимание, что вопрос не содержит формат '% ss', который нужен вашему примеру. Это не «предлагаемое исправление» - в исходном коде нет ничего плохого, это всего лишь предлагаемое изменение. – pycruft
Похоже, вы этого не понимаете. (A) Помещение скобок так, как вы делали, меняет порядок операций **. Когда у вас есть выражение типа 'A% B% C', оно выполняется как' (A% B)% C', а не как 'A% (B% C)', так как ваш первый набор parens заставляет его , (B) Кроме того, ваше понимание того, что put() вокруг выражения делает кортеж из него неправильным, - это не так. Для принудительного кортежа вам нужно либо явно использовать конструктор 'tuple()', либо использовать «глупую запятую», например, так: «% s limit 1»% (sql% (table,))) - это создаст кортежи, но ваш пример по-прежнему будет неправильным из-за (A) –