Python CSV-ридер для строки в ридере - что представляет собой подчеркивание в этом коде? - PullRequest
0 голосов
/ 15 апреля 2020

Я читаю данные из файла CSV. Я понимаю, что 'row' - это переменная, представляющая l oop, через который я прохожу, но что за "_" выбрасывается здесь?

for row in csv_reader:
  _, Student.objects.get_or_create(
      first_name=row[0],
      last_name=row[1],
      email=row[2],
      organisation=row[3],
      enrolled=row[4],
      last_booking=row[5],
      credits_total=row[6],
      credits_balance=row[7],
      )

Например, этот код также работает:

for row in csv_reader:
  Student.objects.get_or_create(
    first_name=row[0],
    last_name=row[1],
    email=row[2],
    organisation=row[3],
    enrolled=row[4],
    last_booking=row[5],
    credits_total=row[6],
    credits_balance=row[7],
    )

Так что я также могу спросить, почему «_» даже там, во-первых?

Я нашел идею в ответе на другой вопрос, но цель подчеркивание не объяснено.

ПРИМЕЧАНИЕ ОБНОВЛЕНИЯ

Так что, похоже, я допустил небольшую ошибку при копировании исходного кода из другого поста. Первоначальный код был:

  for row in csv_reader:
    _, result = Student.objects.get_or_create(...

, что теперь имеет больше смысла, когда я вижу этот ответ . Код предназначен для распаковки RESULT-файла get_or_create и отбрасывания одного значения кортежа. Я по ошибке не скопировал переменную результата как часть моего кода.

Ответы [ 2 ]

3 голосов
/ 15 апреля 2020

У меня такое чувство, что здесь может быть небольшая синтаксическая ошибка.

get_or_create() возвращает кортеж; объект и логическое значение (true, если объект был создан).

Подчеркивание иногда используется для одного из элементов в этом кортеже (например, bool)

instance, _ = MyObject.objects.get_or_create()

Так что здесь _, Student.objects.get_or_create действительно допустим python Я просто думаю, что, возможно, вам не хватает второй переменной, чтобы распаковать возвращенный кортеж. Если вы напечатаете тип print(type(_)), он вернет "tuple", а если вы print(_), вы увидите кортеж, содержащий объект и логическое значение.

Добавление , после того, как _ делает _ кортеж, поэтому он не выдает ошибку, если вы удалите ,, он выдаст ошибку, а если вы сделаете _,instance, он выдаст ошибку, так как вам потребуется = Student...., если вы распаковываем весь кортеж.

1 голос
/ 15 апреля 2020

_ должно быть определено ранее в вашем кодовом блоке, если этот код не вызывает синтаксическую ошибку. Он может быть определен вне l oop все вместе, и может быть «областью действия» с переменной.

Чтобы дать вам странный пример того, как его можно использовать, мы можем использовать он внутри другого l oop и просто «перехватывает» переменную и ничего с ней не делает:

d = {1:"A", 2:"B", 3:"C"}
for _, value in d.items():
    print(value)

Вывод:

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