Using Python could you please complete the Class Course's todos
Ofromfuture import annotations from typing import TYPE_CHECKING, List, Tuple, Optional if TYPE_CHECKING: from survey import Answer, Survey, Question def sort_students(lst: List[Student], attribute: str) -> List[Student]: Return a shallow copy of
sorted by === Precondition === is a attribute name for the Student class >>> s1 = Student(1, "Misha'), >>> $2 = Student (2, 'Diane'), >>> s3 = Student (3, 'Mario'), >>> sort_students([s1, s3, s2], 'id') == [s1, s2, S3] True >>> sort students([s1, S2, S3], 'name') == [s2, s3, S1] True return sorted(lst, key=lambda s: getattr(s, attribute)); class Student: A Student who can be enrolled in a university course. === Public Attributes === Ed. the df bo andan === Public Attributes === id: the id of the student name: the name of the student === Representation Invariants === name is not the empty string id: int name: str def __init__(self, id_: int, name: str) -> None: " Initialize a student with name and id " self.id = id_ self.name = name self.qa: {Question: Answer} = {}, def ___str_(self) -> str: " Return the name of this student " return self.name def has_answer(self, question: Question) -> bool: Return True iff this student has an answer for a question with the same id as . if question in self.qa: return True else: else: return false def set_answer(self, question: Question, answer: Answer) -> None: Record this student's answer . 'self.qa[question] = answer def get_answer(self, question: Question) -> Optional [Answer]: Return this student's answer to the question . Return None if this student does not have an answer to if question in self.ga: return self.qa[question] return None classmCourse: A University Course === Public Attributes === name: the name of the course students: a list of students enrolled in the course === Representation Invariants === No two students in this course have the same id name is not the empty string name: str 'students: List[Student] def __init__(self, name: str) -> None: Initialize a course with the name of , self.name = name self.students = [] . def enroll_students (self, students: List[Student]) -> None: Enroll all students in in this course. If adding any student would violate a representation invariant, do not add any of the students in bool: Return True iff all the students enrolled in this course have a valid answer for every question in . # TODO: complete the body of this method def get_students(self) -> Tuple [Student, ...): Return a tuple of all students enrolled in this course. Return a tuple of all students enrolled in this course. The students in this tuple should be in order according to their id from lowest id to highest id. Hint: the sort_students function might be useful # TODO: complete the body of this method Ofromfuture import annotations from typing import TYPE_CHECKING, List, Tuple, Optional if TYPE_CHECKING: from survey import Answer, Survey, Question def sort_students(lst: List[Student], attribute: str) -> List[Student]: Return a shallow copy of sorted by === Precondition === is a attribute name for the Student class >>> s1 = Student(1, "Misha'), >>> $2 = Student (2, 'Diane'), >>> s3 = Student (3, 'Mario'), >>> sort_students([s1, s3, s2], 'id') == [s1, s2, S3] True >>> sort students([s1, S2, S3], 'name') == [s2, s3, S1] True return sorted(lst, key=lambda s: getattr(s, attribute)); class Student: A Student who can be enrolled in a university course. === Public Attributes === Ed. the df bo andan === Public Attributes === id: the id of the student name: the name of the student === Representation Invariants === name is not the empty string id: int name: str def __init__(self, id_: int, name: str) -> None: " Initialize a student with name and id " self.id = id_ self.name = name self.qa: {Question: Answer} = {}, def ___str_(self) -> str: " Return the name of this student " return self.name def has_answer(self, question: Question) -> bool: Return True iff this student has an answer for a question with the same id as . if question in self.qa: return True else: else: return false def set_answer(self, question: Question, answer: Answer) -> None: Record this student's answer . 'self.qa[question] = answer def get_answer(self, question: Question) -> Optional [Answer]: Return this student's answer to the question . Return None if this student does not have an answer to if question in self.ga: return self.qa[question] return None classmCourse: A University Course === Public Attributes === name: the name of the course students: a list of students enrolled in the course === Representation Invariants === No two students in this course have the same id name is not the empty string name: str 'students: List[Student] def __init__(self, name: str) -> None: Initialize a course with the name of , self.name = name self.students = [] . def enroll_students (self, students: List[Student]) -> None: Enroll all students in in this course. If adding any student would violate a representation invariant, do not add any of the students in bool: Return True iff all the students enrolled in this course have a valid answer for every question in . # TODO: complete the body of this method def get_students(self) -> Tuple [Student, ...): Return a tuple of all students enrolled in this course. Return a tuple of all students enrolled in this course. The students in this tuple should be in order according to their id from lowest id to highest id. Hint: the sort_students function might be useful # TODO: complete the body of this method