Python эквивалентен Perl qw()

Я часто делаю это в Perl:

printf "%8s %8s %8s\n", qw(date price ret);

Однако лучшее, что я могу придумать в Python, это

print '%8s %8s %8s' % (tuple("date price ret".split()))

Мне просто интересно, есть ли более элегантный способ сделать это? Я в порядке, если вы скажете мне, что это все, и никакие улучшения не могут быть сделаны.


person Community    schedule 20.08.2010    source источник
comment
Почему это вики сообщества? Эту функцию действительно нужно убрать.   -  person Glenn Maynard    schedule 21.08.2010
comment
Извините, я, должно быть, неправильно щелкнул окно вики. Как мне это удалить? (Не вижу такой опции, когда я пытаюсь отредактировать.) Что именно нужно публиковать в вики сообщества? спасибо.   -  person Zhang18    schedule 21.08.2010
comment
Его нельзя удалить, просто считайте это уроком на следующий раз. Идея опции вики сообщества, вероятно, лучше всего объяснена на странице meta.stackexchange.com/questions/11740/   -  person David Z    schedule 21.08.2010
comment
tuple() и дополнительные скобки избыточны. Вот почему @masonk написал свой ответ, то есть просто сделайте print '%8s %8s %8s' % "date price ret".split().   -  person clacke    schedule 03.11.2015
comment
не полный ответ; но вы знаете, что исходный код не должен быть набран человеком? это можно сделать скриптом perl 1line...   -  person Owen Beresford    schedule 04.06.2020


Ответы (3)


Что ж, определенно нет способа сделать то, что вы можете сделать в Perl, потому что Python будет жаловаться на неопределенные имена переменных и синтаксическую ошибку (возможно, пропущенную запятую). Но я бы написал так (в Python 2.X):

print '%8s %8s %8s' % ('date', 'price', 'ret')

Если вы действительно привязаны к синтаксису Perl, я думаю, вы могли бы определить функцию qw следующим образом:

def qw(s):
    return tuple(s.split())

и тогда вы могли бы написать

print '%8s %8s %8s' % qw('date price ret')

который в основном похож на Perl, за исключением одной пары кавычек в аргументе qw. Но я бы постеснялся это рекомендовать. По крайней мере, не делайте этого только потому, что скучаете по Perl - это только позволяет вам отрицать, что вы сейчас работаете на новом языке программирования ;-) Это как старая история о программистах на Паскале, которые переключаются на C и создают макросы.

#define BEGIN {
#define END   }
person Community    schedule 20.08.2010
comment
Чтобы быть уверенным, я явно пытался обойти ввод кавычек вокруг каждого слова. Список слов обычно составляет около 15-20 слов, поэтому в первую очередь нужна qw(). - person Zhang18; 21.08.2010
comment
Ну, я думаю, что обычный способ Python сделать это - просто смириться и ввести кавычки - в конце концов, вам нужно сделать это только один раз. Но я не думаю, что есть что-то действительно неправильное в использовании этой qw функции. Это может сбить с толку любого, кто читает ваш исходный код и не знаком с Perl, но если вы можете жить с этим, вперед. - person David Z; 21.08.2010
comment
в конце концов, вам нужно сделать это только один раз - за исключением того, что вам нужно сделать это только один раз, каждый раз, когда вы должны это сделать. До того, как я начал регулярно программировать на Perl, я никогда не осознавал, как часто я создавал массивы отдельных токенов или хэши с отдельными токенами для ключей (что является еще одной возможностью опустить кавычки в Perl). qw не имеет значения, просто приятно иметь общую оптимизацию регистра, которая позволяет вам удалять кавычки. - person umassthrower; 08.07.2014
comment
Парадокс Блаба реален. :) paulgraham.com/avg.html (нашел это во время поиска эквивалента в других Языки. По крайней мере, в руби он есть (%w).) - person lindes; 28.04.2020

QW() часто используется для печати заголовков столбцов с помощью join() в Perl. Заголовки столбцов в реальном мире иногда бывают длинными, что делает join("\t", qw()) очень полезным, поскольку его легче читать и он помогает устранить опечатки (например, "x","y" или "x\ty"). Ниже приведен похожий подход в реальном Python:

    print("\t".join('''PubChemId Column ESImode Library.mzmed
      Library.rtmed Metabolite newID Feature.mzmed Feature.rtmed
      Count ppmDiff rtDiff'''.split()))

Строка с тройными кавычками — странная вещь, потому что она удваивается как комментарий. Однако в данном контексте это строка, и она освобождает нас от необходимости беспокоиться о разрывах строк (как qw()).

Спасибо предыдущим ответам за раскрытие этого подхода.

person Community    schedule 13.11.2015

person    schedule
comment
Это то, что уже предложил ОП. Поэтому не очень полезно. - person Uli Köhler; 04.01.2014