Что означает var, _ = что-то в Python?Конкатенация строк? - PullRequest
6 голосов
/ 31 января 2012

Я изучаю 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 ]

13 голосов
/ 31 января 2012

Общая форма

a, b = x, y

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

a = x
b = y

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

4 голосов
/ 31 января 2012

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

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

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

result = call_command(<command>)
stdout = result[0]
3 голосов
/ 31 января 2012

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

2 голосов
/ 31 января 2012

Вы видите это и в perl, с undef вместо _.

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

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

0 голосов
/ 31 января 2012

Нет, это не конкатенация строк._ само по себе ничего не означает в 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 возвращает то, что команда записывает в стандартный вывод в своем первом возвращаемом значении, а что записано в стандартную ошибку во втором.Любой, кто закодировал это, очевидно, не заботился об ошибках, сообщенных командами.

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

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