Question: from __future__ import annotations from typing import TYPE_CHECKING, Optional if TYPE_CHECKING: from survey import Answer, Survey, Question # Provided helper function def sort_students(lst: list[Student], attribute:

from __future__ import annotations from typing import TYPE_CHECKING, Optional

if TYPE_CHECKING: from survey import Answer, Survey, Question

# Provided helper function def sort_students(lst: list[Student], attribute: str) -> list[Student]: """Return a shallow copy of sorted by in non-decreasing order.

Being a shallow copy means that a new list is returned, but it contains ids of the same Student objects as in ; no new Student objects are created. The conseqence of this is that aliasing exists. Suggestion: draw a memory model diagram to ensure that you understand this.

Preconditions: - is an attribute name for the Student class

>>> s1 = Student(1, 'Misha') >>> s2 = 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 student: getattr(student, attribute))

class Student: """A Student who can be enrolled in a university course.

=== Public Attributes === id: the id of the student name: the name of the student

=== Private Attributes === TODO: Describe any private attributes you create here

=== 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 """ # TODO: implement this method!

def __str__(self) -> str: """Return the name of this student """ # TODO: implement this method!

def has_answer(self, question: Question) -> bool: """Return True iff this student has an answer for a question with the same id as and that answer is a valid answer for . """ # TODO: implement this method!

def set_answer(self, question: Question, answer: Answer) -> None: """Record this student's answer to the question .

If this student already has an answer recorded for the question, then replace it with . """ # TODO: implement this method!

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 """ # TODO: implement this method!

class Course: """A University Course

=== Public Attributes === name: the name of the course students: a list of students enrolled in the course

=== Private Attributes === TODO: Describe any private attributes you create here

=== 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 . """ # TODO: implement this method!

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 to the course. """ # TODO: implement this method!

def all_answered(self, survey: Survey) -> bool: """Return True iff all the students enrolled in this course have a valid answer for every question in . """ # TODO: implement this method!

def get_students(self) -> tuple[Student]: """Return a tuple of all students enrolled in this course.

The students in this tuple should be in order according to their id from the lowest id to the highest id.

Hint: the sort_students function might be useful """ # TODO: implement this method!

if __name__ == '__main__': import python_ta

python_ta.check_all(config={'extra-imports': ['typing', 'survey'], 'disable': ['E9992']})

Step by Step Solution

There are 3 Steps involved in it

1 Expert Approved Answer
Step: 1 Unlock blur-text-image
Question Has Been Solved by an Expert!

Get step-by-step solutions from verified subject matter experts

Step: 2 Unlock
Step: 3 Unlock

Students Have Also Explored These Related Databases Questions!