• A humorous and apt representation of duck typing. Source: Mastracci, 2014.
• Duck typing is more about convenience than type safety. Source: Cui, 2015.
• Example of structural typing in Scala. Source: Underwood, 2017, slide 42.

# Duck Typing

## Summary

Duck Typing is a way of programming in which an object passed into a function or method supports all method signatures and attributes expected of that object at run time. The object's type itself is not important. Rather, the object should support all methods/attributes called on it. For this reason, duck typing is sometimes seen as "a way of thinking rather than a type system".

In duck typing, we don't declare the argument types in function prototypes or methods. This implies that compilers can't do type checking. What really matters is if the object has the particular methods/attributes at run time. Duck typing is therefore often supported by dynamic languages. However, some static languages are beginning to "mimic" it via structural typing.

## Milestones

1946

Emil Mazey states at a meeting that "I can’t prove you are a Communist. But when I see a bird that quacks like a duck, walks like a duck, has feathers and webbed feet and associates with ducks—I’m certainly going to assume that he is a duck." The phrase might have originated earlier from James Whitcomb Riley (1849–1916).

1980

Languages of the 1980s such as Smalltalk-80 and Objective-C have the concept of protocols, where the interface is more relevant than the class. In 1992, with reference to Smalltalk-80, William R. Cook of Apple Computer states that interface hierarchy is more useful that inheritance hierarchy.

Jul
2000

What may be the one of the earliest use of the term "duck typing" among programmers, Alex Martelli discusses it on the comp.lang.python Google Group as an alternative to method overloading of C++. He states that duck typing is closer in spirit to polymorphism of C++. He clarifies,

You don't really care for IS-A -- you really only care for BEHAVES-LIKE-A-(in-this-specific-context), so, if you do test, this behaviour is what you should be testing for.

Mar
2017

PEP 544 proposes to introduce structural subtyping to Python.

## Discussion

• What's the origin of the phrase "duck typing"?

The phrase originates from an old saying,

If it walks like a duck, swims like a duck, and quacks like a duck, then it probably is a duck.

What does this mean? Even a non-duck entity that behaves like a duck can be considered a duck because emphasis is on behaviour. By analogy, for computing languages, the type of an object is not important so long as it behaves as expected. This behaviour is defined by the object's methods/properties/attributes while expectations are set by those who invoke the methods/properties/attributes.

For example, a Book class is expected to have an attribute numPages and a method getPage(number), where number is an integer. Let's say a function searchPhrase(book, phrase) is meant to search for a given phrase in a book. This function calls book.getPage() for all book.numPages of the book. A Newspaper is obviously not a book but with duck typing this doesn't matter. If Newspaper has implemented numPages and getPage(number), it can be passed into searchPhrase(book, phrase) as if it's a book. Though it's not a book, it's sufficient that it behaves like one within the context of searchPhrase.

• What's the advantage of having duck typing?

It's been said that dynamic typing in general cuts down development time. There's less boilerplate code. Code is easier to hack. With static typing, compile-time checks slow down the development process. Static typing could be used at a later point to get better performance. Others recommend duck typing only for prototyping and never for production.

While it's true that compile-time checks are useful to catch potential problems early, duck typing enforces following coding conventions, documentation and test-driven methodologies.

Since duck typing isn't exactly a type system, it gives programmers flexibility. In Python, for example, common things are simpler to code. While static typed languages use interfaces, such interfaces may involve excessive refactoring of client code.

• Isn't duck typing more like late binding than a type system?

It can be argued that duck typing is not really a type system in the sense of run-time or compile-time type systems. Type systems typically prescribe rules for defining types, for deducing types from expressions, for determining legality of expressions or storage based on types, and so on. Duck typing doesn't do any of these. Joe Esposito has commented that, "Duck typing is based around conventions, written in the docs instead of code. This allows the language to defer the type system".

Late binding is when an object or method is bound to a name at run time. Duck typing looks similar to late binding except for a subtle difference that it's based on behaviour rather than declared type.

One way to understand this is to recognize that C# (a static typed language) allows for method overloading where methods differ only by their arguments types. This is not possible in Python (dynamic typed language) but duck typing fills in since run-time behaviour is emphasized rather than the type of the object passed to the method. Also, because it's interpreted and does late binding, duck typing is easy to do.

• Can you compare duck typing with structural typing?

Joe Esposito makes a distinction between static duck typing and dynamic duck typing. With the latter, compile-time checks are skipped and this is what we mean when we refer to duck typing. Static duck typing is similar to structural typing that some static typed languages (Scala, F#) support. Structural typing allows for some compile-time checks, not on types but on the supported methods/attributes. Structural typing may be seen as a compiler-enforced subset of duck typing. However, we should also note that structural typing is essentially static typing while duck typing is dynamic.

Just as duck typing is for dynamic typed languages, so is structural typing for static typed languages. Erlang's Behaviours can be seen as static duck typing, that is, with compile-time checking.

Among the languages that support structural typing are Scala, OCaml, Go, Elm and PureScript.

• Can we say that duck typing is another name for implied interfaces?

Static typed languages use explicit interfaces. In C#, we use interfaces: any type that implements an interface can be passed into a method/function that accepts that interface. This was how flexibilty was built into static typed languages but this required upfront interface declaration.

Python doesn't have explicit interfaces: interfaces are implied. For Python, this is not different from duck typing. However, implied interfaces are supported by C++ (for example) in its STL library. Given that C++ does compile-time checks, we can't say in general that implied interfaces is the same as duck typing. Note that when interfaces are implied, there's no formal interface definition, and at best, it may a be shared documentation.

• What languages support duck typing?

Python and Ruby support duck typing, both of which are dynamic typed languages. In general, dynamic typed languages such as JavaScript and TypeScript support duck typing. While C# doesn't, some parts of .NET use duck typing.

In Ruby, for example, StringIO doesn't have IO in its class hierarchy. Yet, it behaves like an IO due to duck typing. In fact, we may say that StringIO and IO share a common protocol, which is exactly how the duck typing concept is seen in OOP languages such as Smalltalk and ObjectiveC. This can be said of Python as well. For example, an iterable is one that supports the iterator protocol, which is nothing more than implementing necessary methods for an object.

It's interesting to note that duck typing has inspired the creation of a [new language called Duck].(http://ducklang.org/).

• How is duck typing related to LBYL and EAFP?

LBYL expands to Look Before You Leap while EAFP expands to Easy to Ask for Forgiveness than Permission. Both these concepts are typically discussed in Python (and possibly other languages as well). Python prefers the EAFP approach, which is the opposite of LBYL.

With LBYL, we typically check if an object is of a compatible type before performing operations on it, such as calling its method. Python has a built-in function isinstance() to do this. With EAFP, we simply call the object's method, expecting that method to be present. If it's not, an exception will be thrown by the Python interpreter, which the code is expected to handle.

With duck typing, validating an object's type is not Pythonic. Thus, duck typing plays well with Python's preference for EAFP though the use of hasattr() can be used instead.

## Sample Code

• # Source: Wikipedia, 2017.

class Sparrow:
def fly(self):
print("Sparrow flying")

class Airplane:
def fly(self):
print("Airplane flying")

class Whale:
def swim(self):
print("Whale swimming")

# The type of entity is not specified
# We expect entity to have a callable named fly at run time
def lift_off(entity):
entity.fly()

sparrow = Sparrow()
airplane = Airplane()
whale = Whale()

lift_off(sparrow) # prints Sparrow flying
lift_off(airplane) # prints Airplane flying
lift_off(whale) # Throws the error 'Whale' object has no attribute 'fly'

## Milestones

1946

Emil Mazey states at a meeting that "I can’t prove you are a Communist. But when I see a bird that quacks like a duck, walks like a duck, has feathers and webbed feet and associates with ducks—I’m certainly going to assume that he is a duck." The phrase might have originated earlier from James Whitcomb Riley (1849–1916).

1980

Languages of the 1980s such as Smalltalk-80 and Objective-C have the concept of protocols, where the interface is more relevant than the class. In 1992, with reference to Smalltalk-80, William R. Cook of Apple Computer states that interface hierarchy is more useful that inheritance hierarchy.

Jul
2000

What may be the one of the earliest use of the term "duck typing" among programmers, Alex Martelli discusses it on the comp.lang.python Google Group as an alternative to method overloading of C++. He states that duck typing is closer in spirit to polymorphism of C++. He clarifies,

You don't really care for IS-A -- you really only care for BEHAVES-LIKE-A-(in-this-specific-context), so, if you do test, this behaviour is what you should be testing for.

Mar
2017

PEP 544 proposes to introduce structural subtyping to Python.

## Tags

• Static vs Dynamic Typing
• Strong vs Weak Typing
• Nominal vs Structural Typing
• Early vs Late Binding
• Class Inheritance

## Top Contributors

Last update: 2018-08-28 09:40:38 by gurumoorthyP
Creation: 2017-03-17 07:13:45 by arvindpdmn

1430
Words
1
Chats
2
Authors
4
Edits
3
Likes
1891
Hits

## Cite As

Devopedia. 2018. "Duck Typing." Version 4, August 28. Accessed 2018-10-18. https://devopedia.org/duck-typing
BETA V0.17
• Site Map