From bf3764b23645179aed869c6eb731fd4db7887009 Mon Sep 17 00:00:00 2001 From: Stef Piatek Date: Mon, 6 Dec 2021 16:33:26 +0000 Subject: [PATCH 1/3] Add starting points for refactoring --- README.md | 15 ------- group.py | 5 --- refactoring/initial_global.py | 61 ++++++++++++++++++++++++++ refactoring/initial_person_class.py | 44 +++++++++++++++++++ refactoring/initial_two_classes.py | 66 +++++++++++++++++++++++++++++ 5 files changed, 171 insertions(+), 20 deletions(-) delete mode 100644 group.py create mode 100644 refactoring/initial_global.py create mode 100644 refactoring/initial_person_class.py create mode 100644 refactoring/initial_two_classes.py diff --git a/README.md b/README.md index 6d7f0c9..e3e9a06 100644 --- a/README.md +++ b/README.md @@ -11,18 +11,3 @@ acquaintances using dictionaries and lists. - Each person in the group has an age. - Each person in the group can have a job. - Each person can be connected to others in different ways, such as "friend", "granddaughter", "colleague" etc. - -Think about how you want to represent the various types of information and the connections between them. - -# Part 1 -Create an example instance, in an editor or a notebook, of a structure for this group: -- Jill is 26, a biologist and she is Zalika's friend and John's partner. -- Zalika is 28, an artist, and Jill's friend -- John is 27, a writer, and Jill's partner. -- Nash is 34, a chef, John's cousin and Zalika's landlord. - -Some things you may wish to consider in your model: -- Does it allow people who have no job? -- Does it allow people with no connections? -- Does it assume that connections are always reciprocal (e.g. if A is B's friend, does B -automatically consider A a friend too?) diff --git a/group.py b/group.py deleted file mode 100644 index e2ec347..0000000 --- a/group.py +++ /dev/null @@ -1,5 +0,0 @@ -"""An example of how to represent a group of acquaintances in Python.""" - -# Your code to go here... - -my_group = diff --git a/refactoring/initial_global.py b/refactoring/initial_global.py new file mode 100644 index 0000000..21f1323 --- /dev/null +++ b/refactoring/initial_global.py @@ -0,0 +1,61 @@ +def average_age(): + """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): + """Add a new person with the given characteristics to the group.""" + new_person = { + "age": age, + "job": job, + "relations": 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" + } + } +} + +nash_relations = { + "John": "cousin", + "Zalika": "landlord" +} + +add_person("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" + print("All assertions have passed!") diff --git a/refactoring/initial_person_class.py b/refactoring/initial_person_class.py new file mode 100644 index 0000000..569d26d --- /dev/null +++ b/refactoring/initial_person_class.py @@ -0,0 +1,44 @@ +class Person: + """A class to represent an individual and their connections.""" + + def __init__(self, name, age, job): + """Create a new Person with the given name, age and job and no connections.""" + self.name = name + self.age = age + self.job = job + self.connections = dict() + + def add_connection(self, person, relation): + """Add a new connection to a person""" + if person in self.connections: + raise ValueError(f"I already know about {person.name}") + self.connections[person] = relation + + def forget(self, person): + """Removes any connections to a person""" + pass + + +def average_age(group): + """Compute the average age of the group's members.""" + all_ages = [person.age for person in group] + return sum(all_ages) / len(group) + + +if __name__ == "__main__": + # ...then create the group members one by one... + jill = Person("Jill", 26, "biologist") + + # ...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") + + # ... then forget Nash and John's connection + nash.forget(john) + # Then create the group + my_group = {jill, zalika, john, nash} + + 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(nash.connections) == 1, "Nash should only have one relation " + print("All assertions have passed!") diff --git a/refactoring/initial_two_classes.py b/refactoring/initial_two_classes.py new file mode 100644 index 0000000..a54d1b3 --- /dev/null +++ b/refactoring/initial_two_classes.py @@ -0,0 +1,66 @@ +class Person: + """A class to represent an individual.""" + + def __init__(self, name, age, job): + """Create a new Person with the given name, age and job.""" + self.name = name + self.age = age + self.job = job + + +class Group: + """A class that represents a group of individuals and their connections.""" + + def __init__(self): + """Create an empty group.""" + self.members = [] + self.connections = {} + + def size(self): + """Return how many people are in the group.""" + pass + + def contains(self, name): + """Check whether the group contains a person with the given name. + Useful to throw errors if we try to add a person who already exists or forget someone. + """ + return any(member.name == name for member in self.members) + + def add_person(self, name, age, job): + """Add a new person with the given characteristics to the group.""" + 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 + + def forget(self, name1, name2): + """Remove the connection between two people.""" + pass + + def average_age(self): + """Compute the average age of the group's members.""" + all_ages = [person.age for person in self.members] + return sum(all_ages) / self.size() + + +if __name__ == "__main__": + # Start with an empty group... + my_group = Group() + # ...then add the group members one by one... + my_group.add_person("Jill", 26, "biologist") + # ...then their connections + my_group.connect("Jill", "Zalika", "friend") + # ... then forget Nash and John's connection + my_group.forget("Nash", "John") + + 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" + print("All assertions have passed!") From 7f2a2f34bc3c5c0fb8ca51454093ed2d0dc909cd Mon Sep 17 00:00:00 2001 From: Stef Piatek Date: Fri, 9 Dec 2022 10:35:36 +0000 Subject: [PATCH 2/3] Add assert to check that group contains still works --- refactoring/initial_two_classes.py | 1 + 1 file changed, 1 insertion(+) diff --git a/refactoring/initial_two_classes.py b/refactoring/initial_two_classes.py index a54d1b3..4054da7 100644 --- a/refactoring/initial_two_classes.py +++ b/refactoring/initial_two_classes.py @@ -60,6 +60,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" From 697223351bec1d1d7df1501c7cd8f9a5925a0567 Mon Sep 17 00:00:00 2001 From: Victor Baycroft Date: Sun, 1 Dec 2024 14:44:36 +0000 Subject: [PATCH 3/3] Adding group as an argument for fuctions --- refactoring/initial_global.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/refactoring/initial_global.py b/refactoring/initial_global.py index 21f1323..9f5ebe0 100644 --- a/refactoring/initial_global.py +++ b/refactoring/initial_global.py @@ -1,16 +1,16 @@ -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): +def forget(person1,person2,group): """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(name, age, job, relations,group): """Add a new person with the given characteristics to the group.""" new_person = { "age": age, @@ -50,12 +50,12 @@ def add_person(name, age, job, relations): "Zalika": "landlord" } -add_person("Nash", 34, "chef", nash_relations) +add_person("Nash", 34, "chef", nash_relations,group) -forget("Nash", "John") +forget("Nash", "John",group) 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 average_age(group) == 28.75, "Average age of the group is incorrect!" assert len(group["Nash"]["relations"]) == 1, "Nash should only have one relation" print("All assertions have passed!")