Table of contents
1.
Introduction
2.
What is Duck Typing in Python?
2.1.
Python
3.
Dynamic vs. Static Typing
4.
Examples of Duck Typing in Python
4.1.
Example 1: Using Different Objects in a Common Function
4.2.
Example 2: Interacting with Different Objects
4.3.
Python
4.4.
Example 3: Mathematical Operations
4.5.
Python
5.
How Python Duck Typing Supports EAFP?
5.1.
What is EAFP?
5.2.
Example of EAFP in Action
5.3.
Python
5.4.
Benefits of EAFP with Duck Typing
6.
Frequently Asked Questions
6.1.
What is duck typing in Python?
6.2.
How does duck typing differ from traditional type checking?
6.3.
Is duck typing more error-prone than static typing?
6.4.
What is the difference between duck typing and inheritance?
7.
Conclusion
Last Updated: Aug 21, 2025
Easy

Duck Typing in Python

Author Ravi Khorwal
0 upvote

Introduction

In Python, duck typing is a programming concept that allows you to use an object based on its methods and attributes, rather than its actual type. It gets its name from the saying "if it walks like a duck and quacks like a duck, it's a duck." With duck typing, the focus is on what an object can do, not what type it is. This makes Python code more flexible & reusable. 

Duck Typing in Python

In this article, we'll learn what duck typing is, how it compares to static typing, look at examples, & see how it enables the "easier to ask for forgiveness than permission" (EAFP) coding style in Python.

What is Duck Typing in Python?

In Python, duck typing is a practical approach where the type or class of an object is less important than the methods it implements. This term comes from the saying, "If it walks like a duck & quacks like a duck, it must be a duck." In programming, this means that if an object performs the necessary behaviors, Python treats it as that type of object.

For instance, consider a function that requires an object that can perform a .quack() method. In Python, any object that has a .quack() method can be passed to this function, regardless of its specific class. Here's a simple example:

  • Python

Python

class Duck:

   def quack(self):

       print("Quack, quack!")

class Person:

   def quack(self):

       print("I'm quacking like a duck!")

def make_it_quack(duck_like):

   duck_like.quack()

duck = Duck()

person = Person()

make_it_quack(duck)

make_it_quack(person)
You can also try this code with Online Python Compiler
Run Code

Outputs: 

Quack, quack!
I'm quacking like a duck!


In this code, both Duck & Person classes have a quack method. The function make_it_quack does not care what type of object it receives, as long as it can perform the quack method. This flexibility is one of the key strengths of using duck typing in Python, as it simplifies code & enhances its interoperability.

Note -: Duck typing helps in writing more generic functions & makes the code more reusable. It also aligns well with Python's philosophy of focusing on practicality & readability in programming.

Dynamic vs. Static Typing

FeatureDynamic TypingStatic Typing
Type DeclarationNot required before use.Must be declared before use.
Type SafetyErrors are caught at runtime.Errors are mostly caught at compile-time.
FlexibilityHigh flexibility with types.Less flexibility; types are fixed.
Execution SpeedGenerally slower due to type checking during execution.Faster, as types are known at compile-time.
Ease of UseEasier for rapid development and prototyping.Requires more upfront planning and structure.
Error DetectionLate error detection, which can lead to runtime errors.Early error detection, enhancing reliability.
Code VerbosityLess verbose, no need for repetitive type declarations.More verbose with explicit type declarations.

Examples of Duck Typing in Python

Let’s look at a few examples where Python’s flexibility allows us to use different types of objects in similar ways, as long as they have the required methods or attributes.

Example 1: Using Different Objects in a Common Function

Suppose we have a function that needs to display text. In Python, we can pass any object that can be converted to a string, demonstrating duck typing.

def display(text):
    print(str(text))
display("Hello, world!")  # Passing a string
display(123)              # Passing an integer
display(3.14)             # Passing a float


In this example, the display function converts any given input to a string using the str() method. Whether the input is a string, integer, or float, the function handles it seamlessly, showcasing the adaptability of Python’s duck typing.

Example 2: Interacting with Different Objects

Let’s say we want to call a method that isn’t defined for some objects inherently, but we define it for our objects, like a .speak() method for different animal classes.

  • Python

Python

class Dog:

   def speak(self):

       return "Bark!"

class Cat:

   def speak(self):

       return "Meow!"

def animal_sound(animal):

   print(animal.speak())

dog = Dog()

cat = Cat()

animal_sound(dog) 

animal_sound(cat)
You can also try this code with Online Python Compiler
Run Code

Outputs: 

Bark!
Meow!


This example demonstrates how different objects (Dog and Cat) can be used interchangeably in the animal_sound function as long as they provide a .speak() method. This is duck typing at work: the function doesn’t care about the type of the object, as long as it has the expected behavior.

Example 3: Mathematical Operations

Python can also perform mathematical operations on different types that support these operations, which is another form of duck typing.

  • Python

Python

numbers = [1, 2.5, 3, 4.5]

total = sum(numbers)

print(total)
You can also try this code with Online Python Compiler
Run Code

Outputs:

11.0


In this case, the sum() function works with a list containing both integers and floats, treating them uniformly for the addition operation.

How Python Duck Typing Supports EAFP?

EAFP, which stands for "Easier to Ask for Forgiveness than Permission," is a programming principle guiding many Python practices. It emphasizes trying to do something assuming it will succeed & handling problems if they arise, rather than checking in advance if it will work. Duck typing plays a crucial role in supporting this approach in Python programming.

What is EAFP?

In the context of duck typing, EAFP allows a program to attempt to use an object in a specific way without checking if the object can be used in that way beforehand. If the object does not support the operation, the program simply catches the resulting exception and handles it. This approach is aligned with Python's dynamic nature, where type checking is done at runtime.

Example of EAFP in Action

Here's an example demonstrating EAFP in Python:

  • Python

Python

class Rectangle:

   def __init__(self, width, height):

       self.width = width

       self.height = height

   def area(self):

       return self.width * self.height

def calculate_area(shape):

   try:

       area = shape.area()

       print(f"The area is {area}.")

   except AttributeError:

       print("Error: The object does not have an area method.")

rect = Rectangle(5, 6)

calculate_area(rect)  # Outputs: The area is 30.

# Passing an object without an 'area' method

calculate_area("I am not a shape") 
You can also try this code with Online Python Compiler
Run Code

Outputs: 

The area is 30.
Error: The object does not have an area method.


In this code:

  • The calculate_area function tries to call the area() method on whatever object it receives.
     
  • If the object has an area() method, it works fine, & the area is calculated & printed.
     
  • If not, Python throws an AttributeError, which is caught by the except block, and an error message is printed.

Benefits of EAFP with Duck Typing

  • Simplicity: Code is often simpler & cleaner because it doesn't clutter up with checks.
     
  • Performance: Checking permission can sometimes be more costly than catching exceptions if the expectation is that the object will usually be able to operate.
     
  • Maintainability: Encourages encapsulation by letting objects handle their own methods & state, rather than peppering the code with checks.

Note: Duck typing & the EAFP principle together make Python code more flexible & intuitive, fitting well with the dynamic & interpreted nature of the language.

Frequently Asked Questions

What is duck typing in Python?

Duck typing in Python is a concept where the type of an object is less important than the methods it implements or the attributes it possesses. If an object can perform the required operations, it is suitable for use, regardless of its type.

How does duck typing differ from traditional type checking?

Traditional type checking, often seen in statically typed languages, requires that the type of an object be known and compatible before the code is executed. In contrast, duck typing allows the code to run as long as the object supports the necessary methods or operations, regardless of its type.

Is duck typing more error-prone than static typing?

Duck typing can lead to runtime errors if incorrect objects are used, as errors are only caught when the problematic operation is attempted. However, this can be mitigated by thorough testing and careful programming, leveraging Python's exception handling mechanisms.

What is the difference between duck typing and inheritance?

Duck typing and inheritance differ in approach: duck typing relies on an object's methods or behavior rather than its type, commonly used in dynamic languages like Python. Inheritance, however, establishes a class hierarchy where subclasses inherit properties and methods from parent classes, enforcing a defined structure.

Conclusion

Duck typing enhances Python's usability and allows developers to write code that is both cleaner and more adaptable. Duck typing makes Python more flexible and faster for development by allowing code to work based on behavior, not strict types. This approach helps create code that's easier to read, reuse, and maintain.

Recommended Readings:

Live masterclass