epeleg
epeleg

Reputation: 10915

Python typed collections

I am new to python (using python 3.6).

I have some class that represents amounts of some fictional coins.

So an instance could represent say 10 bluecoins or negative sums such as -20 redcoins and so on.

I can now hold in a list several such CoinAmounts in a list. e.g.

[CoinAmount(coin='blue',amount=-10), CoinAmount(coin='blue',amount=20), 
 CoinAmount(coin='red',amount=5),   CoinAmount(coin='red',amount=-5),
 CoinAmount(coin='green',amount=5)]

I want to be able to "compress" the above list by summing each type of coin so that I will have.

[CoinAmount(coin='blue',amount=10), CoinAmount(coin='green',amount=5)]

or

[CoinAmount(coin='blue',amount=10), CoinAmount(coin='red',amount=0), CoinAmount(coin='green',amount=5)]

from which it is easy to derive the former...

My Q's are:

1) Would it make sense to have some sort of a ListOfCoinAmounts that subclasses list and adds a compress method? or should I use so CoinAmountUtils class that has a static method that works on a list and Compreses it?

2) Is there a way to ensure that the list actually holds only CoinAmounts or is this should just be assumed and followed (or both - i.e. it can be done but shouldn't ?

3) In a more general way what is the best practice "pythonic" way to handle a "List of something specific"?

Upvotes: 3

Views: 121

Answers (2)

bruno desthuilliers
bruno desthuilliers

Reputation: 77892

Inheritance - when not used for typing - is mostly a very restricted form of composition / delegation, so inheriting from list is ihmo a bad design.

Having some CoinContainer class that delegates to a list is a much better design, in that 1/ it gives you full control of the API and 2/ it lets you change the implementation as you want (you may find out that a list is not the best container for your needs).

Also it will be easier to implement since you don't have to make sure you override all of the list methods and magicmethods, only the ones you need (cf point #1).

wrt/ type-cheking, it's usually not considered pythonic - it's the client code responsability to make sure it only passes compatible objects. If you really want some type-checking here at least use an ABC and test against this ABC, not against a fixed type.

Upvotes: 1

DhruvPathak
DhruvPathak

Reputation: 43235

1) Subclassing list and having only CoinAmount type of elements in it is a good and cleaner method IMO.

2) Yes, that can be done. You can inherit the python list and override append method to check for types. A good example here : Overriding append method after inheriting from a Python List

3) A good practice is indeed extending the list and putting your customizations.

Upvotes: 0

Related Questions