A function is named after the caller rather than what it does

The name of a function represents its contents, no where it is used

def calculate_score_for_table(a, b):
    return sqrt(a**2 + b**2)

def table_rendering(a,b):
    return {'name':'xxx',
            'score', calculate_score_for_table(a,b)}

vs

def cartesian_distance(a, b):
    return sqrt(a**2 + b**2)

def table_rendering(a,b):
    return {'name':'xxx',
            'score', cartesian_distance(a,b)}

diluted responsibility

The getter is definitely responsibility of the class!

def get_property_from_class(x):
    return x.property1 or x.raw_property['alternative']

Over responsibility

class Parcel:
    def open(self):
        pass
    def close(self):
        pass
    def forward(self):
        pass
    def sign(self):
        pass
    def add_to_delivery(self):
        pass

Under abstracted

parcel = {'weight':10, 'height':5}
def sign_parcel(parcel):
    parcel['signature'] = True

Overly abstracted

class ParcelWithLessthat5pages(Parcel):
    pass

class ParcelWithMorethat5pages(Parcel):
    pass

Confusing Identity and equality functions

class MyValueObjectClass:
   def __eq__(self, other):
      return self.id == other.id
       
class MyEntity:
   def __eq__(self, other):
      return all(getattr(self, at) == getattr(other, at) for at in ALL_ATTRIBUTES)


class NoEquality(self):
    pass

NoEquality() == NoEquality()