Что означает var, = что-то в Python? Конкатенация строк?

Я изучаю Python и читаю пример сценария, который включает в себя некоторые определения переменных, которые выглядят так:

output,_ = call_command('git status')
output,_ = call_command('pwd')

def call_command(command):
    process = subprocess.Popen(command.split(' '),
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE)
    return process.communicate()

Если я печатаю вывод, я получаю результирующий вывод оболочки, связанный вместе, поэтому я знаю, что он объединяет переменные. Но я не могу найти никакой ссылки на Конвенцию в любом из документов. Может ли кто-нибудь объяснить мне это, чтобы я точно знал, что использую его правильно?

5 ответов


общий вид

a, b = x, y

is кортеж задание. Соответствующие части назначаются, поэтому вышеизложенное эквивалентно:

a = x
b = y

в вашем случае, call_command() возвращает кортеж из двух элементов (что и есть process.communicate() returns). Вы назначаете первый output и _ (что на самом деле является именем переменной, обычно используемым для имени чего-то, когда вам все равно значение).


здесь есть два соглашения:

  • распаковать результаты в кортеж из двух элементов (,)
  • меня не волнует второй элемент кортежа, поэтому используйте _ в имя переменной.

в данном случае process.communicate возвращает (stdout, stderr), но код, который вызывает call_command не интересуется stderr поэтому он использует эту запись, чтобы получить stdout напрямую. Это было бы более или менее эквивалентно:

result = call_command(<command>)
stdout = result[0]

_ - допустимое имя переменной в Python, которое обычно используется, когда вы не собираетесь использовать результат для чего-либо. Итак, вы распаковываете результаты git команды в две переменные с именем output и _, но не будет использовать второй (я предполагаю, что это статус выхода или, возможно, стандартный вывод ошибок).


вы видите это в Perl тоже, с undef вместо _.

($dev, $ino, undef, undef, $uid, $gid) = stat($file);

см.http://perldoc.perl.org/perldata.html#List-value-constructors


нет, это не конкатенация строк. The _ само по себе ничего не значит в Python.

в Python, функция может возвращать более одного значения, и вы можете назначить несколько переменных в одном операторе. Сочетание этих двух функций позволяет писать код, например:

def foo():
    return 1, 2, 3

a, b, c = foo()
print(a) # prints 1
print(b) # prints 2
print(c) # prints 3

существует общее соглашение в языках, которые поддерживают работу с несколькими значениями, такими как это, называя один _ означает "мне действительно все равно, что в итоге в этом переменная."В вашем примере функция call_command возвращает то, что команда записывает в стандартный вывод в своем первом возвращаемом значении, и то, что записывается в стандартную ошибку во втором. Тот, кто закодировал это, очевидно, не заботился об ошибках, сообщаемых командами.

выходная конкатенация, которую вы упомянули, должна произойти в другом месте.