Синтаксическая ошибка при передаче распакованного аргумента для печати в Python

Вместо простой отладки / журнала распечатайте как это:

print "error ", error_number

Я хотел бы использовать функцию журнала, которую я могу расширять, когда требуется, примерно так:

def log(condition, *message):
    if(<do something here...>):
        print(*message)
        <perhaps do something more...>

и назовите это так:

log(condition, "error ", error_number)

Но я получаю следующую синтаксическую ошибку:

print *message
      ^ SyntaxError: invalid syntax

Это ограничение функции печати или есть какой-то способ заставить ее работать? Если нет, то есть ли эквивалент для печати, который я мог бы использовать?

Я использую Python 2.7, кстати...

4 ответа

Решение

print не является функцией в Python 2.x. В первом фрагменте вы печатаете кортеж, а последний имеет неверный синтаксис. Если вы хотите использовать функцию печати, вам нужно включить ее через from __future__ import print_function,

Если вы не хотите использовать __future__Вы можете определить функцию регистрации следующим образом:

def log(condition, *message):
    if(<do something here...>):
        print ' '.join(str(a) for a in message)
        <perhaps do something more...>

Вы должны использовать print message непосредственно, этого достаточно (он напечатает кортеж дополнительных аргументов).


Небольшое дополнение к предыдущим ответам: в Python 2.x, print это не функция, а утверждение, но print(arg1, arg2) действует... как использующий print заявление о кортеже (arg1, arg2),

Это немного отличается от print arg1, arg2 как можно увидеть:

>>> print 'aaa', 'bbb'
aaa bbb
>>> print('aaa', 'bbb')
('aaa', 'bbb')

Теперь, в дополнение к ответу themel:

случай 1: не использовать * расширить аргумент кортеж

>>> def p(*args):
...     a(args)  # <== args is a tuple
>>> def a(*args):
...     print args  # <== args is a tuple (but nothing else can be used)
>>> p('bb')
(('bb',),)

Результатом является кортеж из кортежа.

Случай 2: расширение аргументов в p:

>>> def p(*args):
...      a(*args)  # <== now arguments are expanding
...
>>> p('bb')
('bb',)

Результатом является кортеж аргументов, данных p,

Так *args является правильным использованием, но это не допускается в утверждении.

Вы просто используете *args объявить кортеж аргумента, а не получить к нему доступ. Смотрите пример в документации:

def write_multiple_items(file, separator, *args):
    file.write(separator.join(args))

Тот факт, что вы получаете SyntaxError следует предупредить вас, что это не имеет ничего общего с print, тем не мение.

Другие вопросы по тегам