Как передать список словарей в функцию?

Я работаю над системой оценок учителей на Django. Мне нужна функциональность, в которой есть некоторая запись типа subject id и marks ученика с фронтенда. Мое приложение на бэкенде берет эти два параметра и создает список словарей с subject id и marks и передает его другой функции, и эта функция суммирует все оценки и выдает мне общую сумму, среднее значение, процент и т.д. Но сейчас я застрял только на total, поэтому, когда я передаю этот список словарей в функцию, она выдает ошибку.

class Marks_entry:
   def marks_entry(subject_id, marks):
      try:
         subject_id = int(input(f'Enter subject id: '))
         marks=int(input(f'Enter marks:  '))
      except ValueError:
            print(f'You can only try integers:')
      marks_entry=[]
      marks_entry.append({
         "subject_id": subject_id,
         "marks": marks
      })
      marks_calculation = marks_calculation(marks_entry)
      return marks_calculation

def marks_calculation(marks_entry):
       total = sum(item['marks'] for item in marks_entry)
       return total

marks=0
subject_id= 0
b= Marks_entry
b.marks_calculation(marks, subject_id)

ошибка:

Enter subject id: 1003
Enter marks: 58
Traceback (most recent call last):
  File "c:\Users\Lenovo\Documents\TGS\controller.py", line 53, in <module>    
    b.marks_entry(subject_id, marks)
  File "c:\Users\Lenovo\Documents\TGS\controller.py", line 43, in marks_entry
    marks_calculation = marks_calculation(marks_entry)
UnboundLocalError: local variable 'marks_calculation' referenced before assignment 

Есть несколько проблем с вашим классом. Во-первых, поскольку вы использовали b.mark_calculation(), я предполагаю, что вы пытались определить эту функцию внутри класса, что сейчас не правильно! Поэтому вызов ее в классе был бы неправильным. Вы должны вызывать ее так:

class Marks_entry:
  def marks_entry(subject_id, marks):
      #...
  def marks_calculation(marks_entry):
       total = sum(item['marks'] for item in marks_entry)
       return total 

Во-вторых, вы вызвали marks_calculation без ссылки на класс. Если вы пытаетесь вызвать функцию класса, в большинстве случаев следует использовать self, чтобы вызвать функцию объекта прямо в нем самом. Это означает, что ваш код должен выглядеть примерно так:

class Marks_entry:
  def marks_entry(subject_id, marks):
      # rest of code
      marks_calculation = self.marks_calculation(marks_entry)
      return marks_calculation

  def marks_calculation(self,marks_entry):
       total = sum(item['marks'] for item in marks_entry)
       return total

В-третьих, вы вызываете класс без (), что кажется неправильным. Вы должны использовать что-то вроде:

# Rest of code
b= Marks_entry()

В-четвертых, я не могу понять ваше намерение использовать b.marks_calculation(marks, subject_id), поскольку вы определили эту функцию для получения только одного аргумента (только marks, а не subject_id). Если вы хотите передать больше переменных в вашу функцию, вы должны определить их в функции перед вызовом функции.

Исходя из вашего нового отредактированного вопроса, существует несколько проблем с вашим текущим кодом -

  • Отступы местами неправильные.
  • Блок try/except должен находиться под циклом while
  • .
  • Поскольку вы хотите сначала поместить все записи в блок marks_entry, вам следует сначала инциализировать его, а затем append поместить в него данные. В настоящее время он сбрасывается обратно в [] после каждой новой записи, которую вы получаете. Таким образом, в нем всегда будет не более 1 элемента, когда вы пытаетесь просуммировать его.
  • Сумма должна быть вычислена в конце, когда вы выйдете из цикла while
  • .

Вот пример кода, построенного поверх вашего -

def marks_calculation(marks_entry):
        total = sum(item['marks'] for item in marks_entry)
        return total

class Student_marks:
    def entry(subject_id, marks):
        marks_entry=[]
        while True:
            value = input("Need to enter marks, Press 'y' for Yes, 'n' for No: ").lower()
            if value == 'n':
                break
            try:
                subject_id = int(input(f'Enter subject id: '))
                marks=int(input(f'Enter marks:  '))
            except ValueError:
                print(f'You can only try integers:')
                continue
            marks_entry.append({
             "subject_id": subject_id,
             "marks": marks
            })
        total_marks = marks_calculation(marks_entry)
        return total_marks

marks=0
subject_id= 0
b = Student_marks
total = b.entry(marks, subject_id)
print(f'Your total marks are {total}')

Вывод образца:

Need to enter marks, Press 'y' for Yes, 'n' for No: y
Enter subject id: 1
Enter marks:  44
Need to enter marks, Press 'y' for Yes, 'n' for No: y
Enter subject id: 2
Enter marks:  23
Need to enter marks, Press 'y' for Yes, 'n' for No: y
Enter subject id: 3
Enter marks:  12
Need to enter marks, Press 'y' for Yes, 'n' for No: n
Your total marks are 79
Вернуться на верх