Understanding Duck Typing in Python

Ayushi Trivedi Last Updated : 17 Jul, 2024
4 min read

Introduction

Imagine a world where the type of an object doesn’t matter as long as it performs the expected actions. This approach makes your code more flexible and easier to manage. Enter duck typing—a powerful programming model that focuses on what an object can do rather than what it is. This article will show you how duck typing can transform your use of object-oriented programming in Python, enhancing the readability and flexibility of your code.

Overview

  • Understand the concept of duck typing and its significance in Python programming.
  • Learn how to implement duck typing in Python with practical examples.
  • Identify the benefits of using duck typing for flexible and maintainable code.
  • Recognize potential pitfalls and best practices when using duck typing.
  • Apply duck typing to real-world Python projects to improve code adaptability.
Understanding Duck Typing in Python

What is Duck Typing?

An object suitability in a duck typing type system is not based on type of the object but rather by the methods and variables it possesses. Well, in line with the saying ‘looks like a duck, swims like a duck, quacks like a duck, it is a duck’, this is where the term comes from. This indeed implies that if an object plays the role of a specific type, it can be used in Python as the said type.

Static Typing vs. Duck Typing

All variables and expressions in statically typed languages, such as Java or C++, have their types known at compile time. While type safety is guaranteed, this may also result in a more stiff and verbose code. For instance, in Java, a variable’s type must be declared before it may be used:

List<String> list = new ArrayList<>();
list.add("Hello");

In contrast, Python uses dynamic typing, where the type of a variable is interpreted at runtime. Duck typing takes this a step further by not checking the type at all, but instead checking for the presence of methods or behaviors:

def add_to_list(obj, item):
    obj.append(item)

my_list = [1, 2, 3]
add_to_list(my_list, 4)

Here, add_to_list will work with any object that has an append method, not just lists.

Benefits of Duck Typing

  • Flexibility: You can develop more reusable and adaptable code by using duck typing. As long as an object provides the necessary methods, you can send it to a function.
  • Simplicity: By doing away with type declarations and explicit interfaces, it makes programming simpler.
  • Polymorphism: Duck typing allows objects of different types to be used interchangeably if they implement the same behavior, which promotes polymorphism.
  • Ease of Refactoring: As long as the new object provides the same methods, you can change an object’s type without changing the code that uses it, which facilitates refactoring.

Examples of Duck Typing

Let’s look at some practical examples to understand duck typing better.

Example 1: A Simple Function

Think about a function that determines a shape’s area. When using duck typing, the function simply needs to know that it has a way to compute the area—it doesn’t care what kind of shape object it is:

class Circle:
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return 3.14 * self.radius ** 2

class Square:
    def __init__(self, side):
        self.side = side

    def area(self):
        return self.side ** 2

def print_area(shape):
    print(f"The area is {shape.area()}")

circle = Circle(5)
square = Square(4)

print_area(circle)
print_area(square)

Output:

The area is 78.5
The area is 16

In this example, print_area works with both Circle and Square objects because they both have an area method.

Example 2: Collections and Iterators

Duck typing is particularly useful when working with collections and iterators. Suppose you want to create a function that prints all items in a collection:

def print_items(collection):
    for item in collection:
        print(item)

my_list = [1, 2, 3]
my_tuple = (4, 5, 6)
my_set = {7, 8, 9}

print_items(my_list)
print_items(my_tuple)
print_items(my_set)

Output:

1
2
3
4
5
6
7
8
9

The print_items function works with lists, tuples, and sets because they all support iteration.

Handling Errors with Duck Typing

One downside of duck typing is that it can lead to runtime errors if an object doesn’t support the expected methods. To handle such cases, you can use exception handling to catch errors gracefully:

def safe_append(obj, item):
    try:
        obj.append(item)
    except AttributeError:
        print(f"Object {obj} does not support the append method")

my_list = [1, 2, 3]
my_string = "hello"

safe_append(my_list, 4)  # Works fine
safe_append(my_string, 'a')  # Prints an error message

Output:

Object hello does not support the append method

Duck Typing in Practice

Duck typing is widely used in Python libraries and frameworks. For instance, in the Python standard library, the json module uses duck typing to serialize objects to JSON:

import json

class CustomObject:
    def to_json(self):
        return {"name": "Custom", "value": 42}

obj = CustomObject()
print(json.dumps(obj.to_json()))

Output:

{"name": "Custom", "value": 42}

Here, the json module expects objects to have a to_json method to convert them to JSON-serializable formats.

Conclusion

Python duck typing is an adaptable method of object-oriented programming that prioritizes behavior above inheritance and types. This method produces cleaner, more maintainable code by improving the code’s intuitiveness and adaptability. It makes it possible to concentrate on an object’s capabilities, leading to more reliable and effective programming techniques. Duck typing grows in usefulness as you work with it and adds it to your Python toolbox.

Frequently Asked Questions

Q1. What is duck typing in Python?

A. Duck typing is a dynamic typing technique where an object’s suitability is determined by the presence of certain methods and properties rather than the object’s type.

Q2. How does duck typing differ from static typing?

A. Static typing checks types at compile-time, while duck typing checks for method and property presence at runtime, focusing on behavior rather than type.

Q3. Why is it called “duck typing”?

A. It’s based on the saying, “If it looks like a duck and quacks like a duck, it must be a duck,” meaning if an object behaves like a certain type, it can be treated as that type.

My name is Ayushi Trivedi. I am a B. Tech graduate. I have 3 years of experience working as an educator and content editor. I have worked with various python libraries, like numpy, pandas, seaborn, matplotlib, scikit, imblearn, linear regression and many more. I am also an author. My first book named #turning25 has been published and is available on amazon and flipkart. Here, I am technical content editor at Analytics Vidhya. I feel proud and happy to be AVian. I have a great team to work with. I love building the bridge between the technology and the learner.

Responses From Readers

Clear

Congratulations, You Did It!
Well Done on Completing Your Learning Journey. Stay curious and keep exploring!

We use cookies essential for this site to function well. Please click to help us improve its usefulness with additional cookies. Learn about our use of cookies in our Privacy Policy & Cookies Policy.

Show details