I have 2 classes. AlchemicalStorage class is used to store the AlchemicalElement objects.
class AlchemicalElement:
def __init__(self, name: str):
self.name = name
def __repr__(self):
return f'<AE: {self.name}>'
class AlchemicalStorage:
def __init__(self):
self.storage_list = []
I already have a function that adds elements to AlchemicalStorage. What I need is a function that gives an overview of the contents of the storage.
What I have so far:
def get_content(self) -> str:
"""
Return a string that gives an overview of the contents of the storage.
Example:
storage = AlchemicalStorage()
storage.add(AlchemicalElement('Fire'))
storage.add(AlchemicalElement('Water'))
storage.add(AlchemicalElement('Water'))
print(storage.get_content())
Output:
Content:
* Fire x 1
* Water x 2
The elements must be sorted alphabetically by name.
"""
count = {}
for e in self.storage_list:
if e not in count:
count[e] = 1
else:
count[e] = 1
The idea is that I want to create a dictionary with keys as elements and values as their amount. But instead of simple 'Fire' I get the representation I made (<AE: Fire>).
The question is: is there a way to get rid of "<AE: >"? Or maybe there's an easier way to write this function without creating dictionary?
Also, I would appreciate an example of how to achieve the output string.
CodePudding user response:
it sounds kind of like you want printing out the AlchemicalStorage
to have a specific format, so you could just create that format in a __str__
method:
from collections import Counter
class AlchemicalStorage:
def __str__(self):
# a Counter will definitely be useful for what you are trying to do
lines = []
for item, count in Counter(self.storage_list).items():
lines.append(f"* {item.name} x {count}")
return "Contents:\n" "\n".join(lines)
The main thing here is instead of relying on the __repr__
method that has formatting you aren't interested in, you can just access the .name
field directly to only show the item name.