Синтаксическая ошибка при передаче распакованного аргумента для печати в Python - PullRequest
5 голосов
/ 09 ноября 2011

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

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 ]

9 голосов
/ 09 ноября 2011

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

7 голосов
/ 26 октября 2013

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

def log(condition, *message):
    if(<do something here...>):
        print ' '.join(str(a) for a in message)
        <perhaps do something more...>
2 голосов
/ 09 ноября 2011

Вы должны использовать 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:

case 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 является правильным использованием, но это не разрешено в выражении.

0 голосов
/ 09 ноября 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...