From 84c4e6ff4a6e06cc8f3ac773086490ade0edb2ff Mon Sep 17 00:00:00 2001 From: Stef Piatek Date: Thu, 8 Dec 2022 17:04:36 +0000 Subject: [PATCH 1/2] Add example solutions for refactoring --- refactoring/initial_global.py | 84 +++++++++++++++-------------- refactoring/initial_person_class.py | 16 ++++-- refactoring/initial_two_classes.py | 39 +++++++++++--- 3 files changed, 87 insertions(+), 52 deletions(-) diff --git a/refactoring/initial_global.py b/refactoring/initial_global.py index 21f1323..b630932 100644 --- a/refactoring/initial_global.py +++ b/refactoring/initial_global.py @@ -1,16 +1,10 @@ -def average_age(): +def average_age(group): """Compute the average age of the group's members.""" all_ages = [person["age"] for person in group.values()] return sum(all_ages) / len(group) -def forget(person1, person2): - """Remove the connection between two people.""" - group[person1]["relations"].pop(person2, None) - group[person2]["relations"].pop(person1, None) - - -def add_person(name, age, job, relations): +def add_person(group, name, age, job, relations): """Add a new person with the given characteristics to the group.""" new_person = { "age": age, @@ -20,42 +14,50 @@ def add_person(name, age, job, relations): group[name] = new_person -group = { - "Jill": { - "age": 26, - "job": "biologist", - "relations": { - "Zalika": "friend", - "John": "partner" - } - }, - "Zalika": { - "age": 28, - "job": "artist", - "relations": { - "Jill": "friend", - } - }, - "John": { - "age": 27, - "job": "writer", - "relations": { - "Jill": "partner" - } - } -} +def forget(group, person1, person2): + """Remove the connection between two people.""" + group[person1]["relations"].pop(person2, None) + group[person2]["relations"].pop(person1, None) -nash_relations = { - "John": "cousin", - "Zalika": "landlord" -} -add_person("Nash", 34, "chef", nash_relations) +def add_nash(group): + """Add nash to the group.""" + nash_relations = { + "John": "cousin", + "Zalika": "landlord" + } + add_person(group, "Nash", 34, "chef", nash_relations) -forget("Nash", "John") if __name__ == "__main__": - assert len(group) == 4, "Group should have 4 members" - assert average_age() == 28.75, "Average age of the group is incorrect!" - assert len(group["Nash"]["relations"]) == 1, "Nash should only have one relation" + my_group = { + "Jill": { + "age": 26, + "job": "biologist", + "relations": { + "Zalika": "friend", + "John": "partner" + } + }, + "Zalika": { + "age": 28, + "job": "artist", + "relations": { + "Jill": "friend" + } + }, + "John": { + "age": 27, + "job": "writer", + "relations": { + "Jill": "partner" + } + } + } + add_nash(my_group) + forget(my_group, "Nash", "John") + + assert len(my_group) == 4, "Group should have 4 members" + assert average_age(my_group) == 28.75, "Average age of the group is incorrect!" + assert len(my_group["Nash"]["relations"]) == 1, "Nash should only have one relation" print("All assertions have passed!") diff --git a/refactoring/initial_person_class.py b/refactoring/initial_person_class.py index 569d26d..85a024e 100644 --- a/refactoring/initial_person_class.py +++ b/refactoring/initial_person_class.py @@ -16,7 +16,9 @@ def add_connection(self, person, relation): def forget(self, person): """Removes any connections to a person""" - pass + if person not in self.connections: + raise ValueError(f"I don't know about {person.name}") + self.connections.pop(person) def average_age(group): @@ -28,11 +30,17 @@ def average_age(group): if __name__ == "__main__": # ...then create the group members one by one... jill = Person("Jill", 26, "biologist") - + zalika = Person("Zalika", 28, "artist") + john = Person("John", 27, "writer") + nash = Person("Nash", 34, "chef") # ...then add the connections one by one... - # Note: this will fail from here if the person objects aren't created jill.add_connection(zalika, "friend") - + zalika.add_connection(jill, "friend") + jill.add_connection(john, "partner") + john.add_connection(john, "partner") + nash.add_connection(john, "cousin") + john.add_connection(nash, "cousin") + nash.add_connection(zalika, "Landlord") # ... then forget Nash and John's connection nash.forget(john) # Then create the group diff --git a/refactoring/initial_two_classes.py b/refactoring/initial_two_classes.py index a54d1b3..b4cfc28 100644 --- a/refactoring/initial_two_classes.py +++ b/refactoring/initial_two_classes.py @@ -18,7 +18,7 @@ def __init__(self): def size(self): """Return how many people are in the group.""" - pass + return len(self.members) def contains(self, name): """Check whether the group contains a person with the given name. @@ -26,23 +26,42 @@ def contains(self, name): """ return any(member.name == name for member in self.members) + def number_of_connections(self, name): + """Find the number of connections that a person in the group has""" + if not self.contains(name): + raise ValueError(f"I don't know about {name}.") + return sum(1 for (first, second) in self.connections if first == name) + def add_person(self, name, age, job): """Add a new person with the given characteristics to the group.""" + if self.contains(name): + raise ValueError(f"I already know about {name}.") self.members.append(Person(name, age, job)) - def number_of_connections(self, name): - """Find the number of connections that a person in the group has""" - pass - def connect(self, name1, name2, relation, reciprocal=True): """Connect two given people in a particular way. Optional reciprocal: If true, will add the relationship from name2 to name 1 as well """ - pass + if not self.contains(name1): + raise ValueError(f"I don't know who {name1} is.") + if not self.contains(name2): + raise ValueError(f"I don't know who {name2} is.") + if (name1, name2) in self.connections: + raise ValueError(f"{name1} already knows {name2} as a " + f"{self.connections[(name1, name2)]}") + self.connections[(name1, name2)] = relation + if reciprocal: + self.connections[(name2, name1)] = relation def forget(self, name1, name2): """Remove the connection between two people.""" - pass + if not self.contains(name1): + raise ValueError(f"I don't know who {name1} is.") + if not self.contains(name2): + raise ValueError(f"I don't know who {name2} is.") + if (name1, name2) not in self.connections: + raise ValueError(f"{name1} does not know {name2} yet.") + self.connections.pop((name1, name2)) def average_age(self): """Compute the average age of the group's members.""" @@ -55,8 +74,14 @@ def average_age(self): my_group = Group() # ...then add the group members one by one... my_group.add_person("Jill", 26, "biologist") + my_group.add_person("Zalika", 28, "artist") + my_group.add_person("John", 27, "writer") + my_group.add_person("Nash", 34, "chef") # ...then their connections my_group.connect("Jill", "Zalika", "friend") + my_group.connect("Jill", "John", "partner") + my_group.connect("Nash", "John", "cousin", reciprocal=False) + my_group.connect("Nash", "Zalika", "landlord", reciprocal=False) # ... then forget Nash and John's connection my_group.forget("Nash", "John") From 5b083f93e632be872d89a749f1fc1170bef6f500 Mon Sep 17 00:00:00 2001 From: Stef Piatek Date: Fri, 9 Dec 2022 10:39:48 +0000 Subject: [PATCH 2/2] Reorder code for better diffs --- refactoring/initial_global.py | 12 ++++++------ refactoring/initial_two_classes.py | 13 +++++++------ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/refactoring/initial_global.py b/refactoring/initial_global.py index b630932..b412a30 100644 --- a/refactoring/initial_global.py +++ b/refactoring/initial_global.py @@ -4,6 +4,12 @@ def average_age(group): return sum(all_ages) / len(group) +def forget(group, person1, person2): + """Remove the connection between two people.""" + group[person1]["relations"].pop(person2, None) + group[person2]["relations"].pop(person1, None) + + def add_person(group, name, age, job, relations): """Add a new person with the given characteristics to the group.""" new_person = { @@ -14,12 +20,6 @@ def add_person(group, name, age, job, relations): group[name] = new_person -def forget(group, person1, person2): - """Remove the connection between two people.""" - group[person1]["relations"].pop(person2, None) - group[person2]["relations"].pop(person1, None) - - def add_nash(group): """Add nash to the group.""" nash_relations = { diff --git a/refactoring/initial_two_classes.py b/refactoring/initial_two_classes.py index b4cfc28..3f47dac 100644 --- a/refactoring/initial_two_classes.py +++ b/refactoring/initial_two_classes.py @@ -26,18 +26,18 @@ def contains(self, name): """ return any(member.name == name for member in self.members) - def number_of_connections(self, name): - """Find the number of connections that a person in the group has""" - if not self.contains(name): - raise ValueError(f"I don't know about {name}.") - return sum(1 for (first, second) in self.connections if first == name) - def add_person(self, name, age, job): """Add a new person with the given characteristics to the group.""" if self.contains(name): raise ValueError(f"I already know about {name}.") self.members.append(Person(name, age, job)) + def number_of_connections(self, name): + """Find the number of connections that a person in the group has""" + if not self.contains(name): + raise ValueError(f"I don't know about {name}.") + return sum(1 for (first, second) in self.connections if first == name) + def connect(self, name1, name2, relation, reciprocal=True): """Connect two given people in a particular way. Optional reciprocal: If true, will add the relationship from name2 to name 1 as well @@ -85,6 +85,7 @@ def average_age(self): # ... then forget Nash and John's connection my_group.forget("Nash", "John") + assert my_group.contains("John"), "John should be in the group" assert my_group.size() == 4, "Group should have 4 members" assert my_group.average_age() == 28.75, "Average age of the group is incorrect!" assert my_group.number_of_connections("Nash") == 1, "Nash should only have one relation"