目次
- 1 1. Introduction
- 2 2. What are Type Hints?
- 3 3. Basic Type Annotations
- 4 4. Type Annotations for Complex Data Structures
- 5 5. Advantages and Limitations of Type Hints
- 6 6. Type Checking with Static Analysis Tools
- 7 7. Practical Examples of Using Type Hints
- 8 8. Frequently Asked Questions (FAQ)
- 8.1 What problems arise if you don’t use type hints?
- 8.2 Do type hints improve execution speed?
- 8.3 Is there a way to make type hints mandatory?
- 8.4 How can you address slow type checking with mypy?
- 8.5 What resources are recommended for beginners learning type hints?
- 8.6 When should you use type hints and when are they not necessary?
- 8.7 What practical benefits does using type hints provide?
- 8.8 Summary
- 9 9. Summary
1. Introduction
Python is a programming language favored by a wide range of users—from beginners to professionals—because of its flexibility and ease of use. However, Python’s characteristic “dynamic typing” can sometimes affect a program’s readability and maintainability. To address this, type hints (Type Hints) were introduced in Python 3.5 and later. Using type hints can improve code readability and quality and boost development efficiency. This article explains how to use Python’s “type hints” for “specifying argument types”, covering everything from the basics to practical applications.Characteristics of Python’s dynamic typing
One feature of Python is “dynamic typing”, meaning variables and functions can work without explicitly specifying types. For example, code like the following runs without issue in Python.def add(a, b):
return a + b
result = add(1, 2) # Works correctly
This flexibility allows for rapid prototyping and development, but it can also lead to issues such as the following.- Function argument and return types can be unclear, and incorrect usage may not raise errors
- As a project grows, inferring types becomes difficult, which can increase the likelihood of bugs
Why type hints were introduced
Type hints were introduced to address these problems; they provide a way to add type information to code. This brings benefits such as:- Improved readability: Explicit type information makes the roles of functions and variables easier to understand
- Use of static analysis tools: Tools like mypy can detect type errors before runtime
- Increased development efficiency: IDE autocompletion is enhanced, allowing you to write code more efficiently

2. What are Type Hints?
Python’s “type hints (Type Hints)” are a mechanism for specifying type information for functions and variables in code. This clarifies the intent of the code and enables static analysis tools and IDEs to perform type checking. Introduced in Python 3.5 by PEP 484, the feature has been expanded in subsequent versions.Purpose of Type Hints
The purpose of type hints is to prevent errors at the time of writing code rather than detecting them during program execution. They are especially helpful in situations like the following.- Improved code readability: Explicit types make the roles of functions and variables clear at a glance.
- Improved team development efficiency: Reduces misunderstandings among developers and makes code reviews smoother.
- Use of static analysis: Tools like mypy and PyCharm can detect type errors in advance.
Examples of Type Hints
Using type hints, you can explicitly specify the types of arguments and return values as shown below.Function Type Hints
def greet(name: str) -> str:
return f"Hello, {name}!"
In this code, name
is specified as a string (str
), and the function’s return value is also a string. Compared to not using type hints, the function’s intent is clearer.Variable Type Hints
From Python 3.6 onward, you can also add type hints to variables.age: int = 25
names: list = ["Alice", "Bob", "Charlie"]
Characteristics of Type Hints
Type hints are just “hints” and do not change Python’s dynamic typing behavior. For example, a type mismatch will not raise an error at runtime.Example of a Type Mismatch
def add_numbers(a: int, b: int) -> int:
return a + b
result = add_numbers(10, "20") # No error occurs at runtime
The code above will cause an error at runtime, but if you use a static analysis tool (for example, mypy), you can detect the error beforehand.Static Analysis Detection Example
Using mypy, it will point out type mismatches like the following.error: Argument 2 to "add_numbers" has incompatible type "str"; expected "int"
Advantages and Limitations of Type Hints
Advantages
- Improves code readability.
- Enhances IDE autocompletion.
- Allows preventing bugs in advance using static analysis tools.
Limitations
- Types are not enforced at runtime (static analysis tools are required).
- When complex type specifications are required, readability may decrease.
Considerations When Introducing Type Hints
- Introduce type hints gradually For large existing projects, it’s recommended to start by adding type hints to some functions or modules.
- Avoid overly complex type annotations Unnecessarily complex type specifications can harm readability, so it’s important to keep them concise.
- Use static analysis tools When introducing type hints, you can maximize their effectiveness by using tools like
mypy
andpylint
.

3. Basic Type Annotations
By using Python’s type hints, you can explicitly specify types for function arguments, return values, and variables. This section provides a detailed explanation of basic type annotation methods.Specifying Types for Function Arguments and Return Values
Adding type hints to function arguments and return values makes it clear what types the function accepts and returns.Simple Type Annotations
Below is a simple example of specifying types for arguments and return values.def add(a: int, b: int) -> int:
return a + b
a
andb
: receive an integer type (int
).- Return value: returns an integer type (
int
).
Multiple Arguments
Type hints can be used easily even when a function has multiple arguments.def greet(name: str, age: int) -> str:
return f"Hello, {name}! You are {age} years old."
- In this function, it receives a string-typed
name
and an integer-typedage
, and returns a string type.
Type Annotations for Variables
Since Python 3.6, you can also add type hints to variables.Basic Variable Type Annotations
name: str = "Alice"
age: int = 30
is_student: bool = True
name
: string typeage
: integer typeis_student
: boolean type (bool
)
Type-Annotated Variables Without Initial Values
If you only specify a variable’s type without giving it an initial value, you write it as follows.height: float # Type is specified, but no initial value
In this case, you will need to assign a value of the appropriate type to height
later.Omitting Type Hints and Type Inference
In Python, code works without type hints, but lacking them can make the intent harder to convey.When There Are No Type Hints
def multiply(a, b):
return a * b
In this function, the types of a
and b
are unknown. Consequently, developers or IDEs reading the code cannot accurately infer the types.When You Add Type Hints
def multiply(a: int, b: int) -> int:
return a * b
By adding type hints, it becomes clear that this function accepts an integer argument and returns an integer.Type Annotations for Collection Types
In Python, you can also specify type hints for collection types such as lists and dictionaries. It is common to use the “typing” module for this.List Type Annotations
List type hints useList
from the typing
module.from typing import List
numbers: List[int] = [1, 2, 3]
Dictionary Type Annotations
Specify the types of dictionary keys and values.from typing import Dict
student_ages: Dict[str, int] = {"Alice": 20, "Bob": 25}
Example Functions Using Type Annotations
Below is an example of a function that uses multiple types.from typing import List
def calculate_average(grades: List[float]) -> float:
return sum(grades) / len(grades)
grades = [85.5, 90.0, 78.5]
average = calculate_average(grades)
print(f"Average grade: {average}")
Summary
Using type hints makes the code’s intent clear and helps prevent bugs. This section covered basic type annotation methods. Next, the “4. Type Annotations for Complex Data Structures” section will discuss more advanced techniques.
4. Type Annotations for Complex Data Structures
In Python, you can specify types not only for basic collection types such as lists and dictionaries, but also for complex data structures like tuples, nested structures, and optional types. This section explains how to provide type hints for these data structures.Typing Lists and Tuples
Typing Lists
List type hints use thetyping
module’s List
. By specifying the element type, you can define the list’s contents more precisely.from typing import List
numbers: List[int] = [1, 2, 3, 4]
names: List[str] = ["Alice", "Bob", "Charlie"]
numbers
: a list of integers (int
)names
: a list of strings (str
)
Typing Tuples
Tuples specify their type usingTuple
. By listing the types of each element in order, you can represent tuples with elements of different types.from typing import Tuple
person: Tuple[str, int] = ("Alice", 25)
- In this example,
person
represents a pair of a string (name) and an integer (age).
Typing Dictionaries
When specifying the types of dictionary keys and values, useDict
.Basic Dictionary Typing
from typing import Dict
student_scores: Dict[str, float] = {"Alice": 95.5, "Bob": 87.0}
- In this example, the keys are strings (
str
) and the values are floating-point numbers (float
).
Nested Dictionaries
You can also specify types when a dictionary’s value is another dictionary.from typing import Dict
class_data: Dict[str, Dict[str, int]] = {
"Class A": {"Alice": 85, "Bob": 90},
"Class B": {"Charlie": 88, "Dave": 92},
}
- In this example, the outer dictionary’s keys are class names (
str
), and its values are dictionaries mapping student names (str
) to scores (int
).
Optional and Union Types
Optional Type
Optional
is used when an argument or return value can be the “specified type or None
“.from typing import Optional
def find_student(name: str) -> Optional[str]:
students = ["Alice", "Bob", "Charlie"]
return name if name in students else None
- In this example, the
find_student
function returns either astr
or aNone
.
Union Type
Union
can be used to specify multiple types.from typing import Union
def calculate(value: Union[int, float]) -> float:
return value * 2.0
- In this example,
value
accepts either an integer (int
) or a floating-point number (float
).
Custom Types and Type Aliases
Type Aliases
Using type aliases allows you to express complex type specifications concisely.from typing import List
Vector = List[float]
def add_vectors(v1: Vector, v2: Vector) -> Vector:
return [x + y for x, y in zip(v1, v2)]
Vector
is defined as a list of floating-point numbers (List[float]
).
Typing Custom Classes
Custom classes can also be used in type hints.class Student:
def __init__(self, name: str, age: int):
self.name = name
self.age = age
def enroll_student(student: Student) -> str:
return f"{student.name} has been enrolled."
- In this example, the
Student
class is used as a type hint.
Typing with Generics
UsingGeneric
lets you define reusable types.from typing import TypeVar, Generic, List
T = TypeVar('T')
class Stack(Generic[T]):
def __init__(self):
self.items: List[T] = []
def push(self, item: T) -> None:
self.items.append(item)
def pop(self) -> T:
return self.items.pop()
- In this example, the stack can handle any type (
T
).
Summary
In this section, we covered how to specify types for complex data structures, ranging from basic collection types like lists, tuples, and dictionaries to Optional types, Union types, and custom type aliases. Using type hints greatly improves code readability and safety. In the next section, “5. Benefits and Limitations of Type Hints,” we will discuss in detail the advantages and challenges of adopting type hints. Thank you for staying with us!
5. Advantages and Limitations of Type Hints
Python type hints bring many benefits to code quality. However, there are also limitations and caveats to be aware of. In this section, we’ll explain the advantages and limitations of type hints in detail.Advantages of Type Hints
1. Improves code readability
Using type hints clarifies the purpose of functions and variables and greatly improves code readability. This is especially helpful in team development, where other developers can more easily understand the code. Example:def calculate_area(length: float, width: float) -> float:
return length * width
- Without type hints, it’s unclear what types
length
andwidth
expect, but type hints make that explicit.
2. Detect bugs earlier with static analysis tools
By using type hints, static analysis tools likemypy
can check your code and detect type mismatches and errors of time.
Example: Detecting a type mismatchdef add(a: int, b: int) -> int:
return a + b
# mypy check result:
# error: Argument 2 to "add" has incompatible type "str"; expected "int"
result = add(10, "20") # Type error
3. IDE autocompletion is enhanced
Adding type hints enables IDEs (e.g., PyCharm or VSCode) to provide better autocompletion. This improves development efficiency and reduces errors. Example:def greet(name: str) -> str:
return f"Hello, {name}!"
greet("Alice") # The IDE auto-completes the argument and return types
4. Serves as documentation
Type hints act as lightweight documentation within the code. Developers can understand a function’s behavior from the type information without consulting external documentation.Limitations of Type Hints
1. Types are not enforced at runtime
Type hints do not affect Python at runtime, so type consistency is only checked by static analysis. Since they are ignored at runtime, they won’t prevent errors caused by type mismatches. Example:def divide(a: int, b: int) -> float:
return a / b
result = divide("10", 2) # Error at runtime
2. Type annotations can become cumbersome
When dealing with complex data structures or generics, type hints can become verbose and harm readability. Example: Complex type hintsfrom typing import Dict, List
data: Dict[str, List[Dict[str, int]]] = {
"group1": [{"name": 5}, {"name": 10}],
"group2": [{"name": 15}],
}
- Overly detailed type annotations can hurt readability.
3. Learning overhead
Beginners unfamiliar with type hints face a learning overhead. They also need to understand the various types available in thetyping
module.4. No impact on execution speed
Because type hints are ignored at runtime, strictly specifying types won’t improve execution speed. If you need type checking, you must use separate static analysis tools.Considerations When Introducing Type Hints
- Introduce type hints gradually For large existing projects, it’s recommended to introduce type hints starting with some functions or modules.
- Avoid cumbersome type annotations Overly complex type annotations can hurt readability, so keep things concise.
- Use static analysis tools When introducing type hints, combining them with tools like
mypy
andpylint
maximizes their effectiveness.

6. Type Checking with Static Analysis Tools
Python type hints do not affect runtime behavior, but using static analysis tools can detect type mismatches and potential bugs. This section explains how to use mypy, a representative static analysis tool that works well with type hints.What is a static analysis tool?
Static analysis tools check types and syntax without running code. By performing static analysis with type hints, you can discover errors and issues like the following in advance.- Mismatch between argument and return types
- Calls to undefined variables or functions
- Identification of ambiguous type areas
Installing mypy and basic usage
1. Installing mypy
First, install mypy usingpip
.pip install mypy
2. Type checking with mypy
Statically analyze Python scripts that include type hints. Run the command as follows.mypy your_script.py
Example: When analyzing a script example.py
that contains the following codedef add(a: int, b: int) -> int:
return a + b
result = add(10, "20") # Type error
When you run the command, you will see an error like the following.error: Argument 2 to "add" has incompatible type "str"; expected "int"
3. Basic mypy options
mypy provides various options that allow you to flexibly customize type checking.--strict
: Enable strict type checking.--ignore-missing-imports
: Ignore import errors.--disallow-untyped-defs
: Disallow functions without type hints.
mypy --strict example.py
Using type checking in IDEs
1. Type checking in PyCharm
PyCharm is an IDE that can integrate type hints and mypy. Using PyCharm provides the following benefits.- Detect type errors in real time as you write code.
- Provide code completion based on type hints.
- In PyCharm go to “Settings” → “Languages & Frameworks” → “Python” → “Type Hinting” and enable type hints.
- Configure mypy as needed.
JetBrains
Built for web, data, and AI/ML professionals. Supercharged w…
2. Type checking in Visual Studio Code (VSCode)
VSCode also supports type hints. By installing the Python extension, you can enable type checking and completions.- Installing the “pylance” extension enables real-time checks based on type hints.
Practical examples using type checking tools
Example 1: Type checking for required arguments
def greet(name: str) -> str:
return f"Hello, {name}!"
print(greet(123)) # Type error
mypy will point out when argument types do not match.Example 2: Checking Optional types
from typing import Optional
def find_student(student_id: int) -> Optional[str]:
students = {1: "Alice", 2: "Bob"}
return students.get(student_id)
student_name = find_student(3)
print(student_name.upper()) # Type error (NoneType has no attribute 'upper')
mypy considers the possibility of Optional
types and flags errors where None
is not checked.Visual Studio Code redefines AI-powered coding with GitHub C…
How to incorporate type checking into your workflow
1. Automate type checking
By integrating mypy into your CI/CD pipeline, you can automate type checking. This allows you to detect type errors during pull requests and prevent problematic code from being deployed.2. Integrate into the development flow
By establishing rules like the following, you can effectively use type hints.- Always add type hints to new code.
- Regularly run mypy on the entire project.
- If type hints are ambiguous, provide additional explanations in comments or documentation.
Summary
By using static analysis tools, you can effectively utilize type hints to improve code quality and detect bugs early. In particular, adopting mypy helps you build a development environment that makes the most of type hints. The next section, “7. Practical examples of using type hints”, provides concrete examples of designing functions and classes with type hints.
7. Practical Examples of Using Type Hints
In this section, we’ll explain how Python type hints can be applied in real-world work using concrete examples. Type hints are a powerful tool that go beyond mere documentation, improving code readability and safety. We’ll demonstrate how to use type hints in various cases such as functions, classes, and variadic arguments.Using Type Hints in Functions
1. Basic Function Type Annotations
Using type hints, you can clearly describe a function’s inputs and outputs. Example:def calculate_area(length: float, width: float) -> float:
return length * width
area = calculate_area(5.0, 3.0)
print(f"Area: {area}")
- Arguments
length
andwidth
are floating-point types (float
). - The return value is also a floating-point type (
float
).
2. Type Annotations for Default Arguments
You can also specify type hints when a function has default arguments. Example:def greet(name: str = "Guest") -> str:
return f"Hello, {name}!"
print(greet()) # "Hello, Guest!"
print(greet("Alice")) # "Hello, Alice!"
name
is a string type with a default value of"Guest"
.
Type Hints for Variadic Arguments
1. Type Annotations for Variadic Arguments (*args)
When receiving multiple arguments, you can use*args
to indicate their type.
Example:from typing import List
def sum_numbers(*numbers: int) -> int:
return sum(numbers)
print(sum_numbers(1, 2, 3)) # 6
*numbers
accepts a tuple of integers (int
).
2. Type Annotations for Keyword Arguments (**kwargs)
You can also provide type hints when using keyword arguments. Example:from typing import Dict
def display_info(**info: str) -> None:
for key, value in info.items():
print(f"{key}: {value}")
display_info(name="Alice", age="25", city="New York")
**info
is a dictionary with string keys and string values (Dict[str, str]
).
Type Hints in Class Design
1. Type Hints Inside Classes
Adding type hints to class attributes and methods makes the design clearer. Example:class Student:
def __init__(self, name: str, age: int):
self.name = name
self.age = age
def introduce(self) -> str:
return f"My name is {self.name}, and I am {self.age} years old."
student = Student("Alice", 20)
print(student.introduce())
name
andage
are a string (str
) and an integer (int
), respectively.- The
introduce
method returns a string (str
).
2. Specifying Type Hints for Class Attributes
You can also write type hints for class-level attributes. Example:class School:
name: str = "Default School"
students: int = 0
name
is a string (str
), andstudents
is an integer (int
).
Practical Use of Type Aliases
Using type aliases allows you to reuse complex types more concisely.1. Defining Type Aliases
from typing import List
Vector = List[float]
def calculate_magnitude(vector: Vector) -> float:
return sum(x**2 for x in vector) ** 0.5
vector = [1.0, 2.0, 3.0]
print(calculate_magnitude(vector)) # 3.7416573867739413
Vector
is defined as a list of floating-point numbers (List[float]
).
2. Using Custom Types
You can use type aliases for complex data structures. Example:from typing import Dict, List
StudentScores = Dict[str, List[int]]
scores: StudentScores = {
"Alice": [90, 85, 88],
"Bob": [72, 75, 78]
}
StudentScores
is a dictionary with string keys and values that are lists of integers.
Designing Safe Code Using Type Checking
By combining with type-checking tools (such as mypy), you can improve the safety of production code.1. Checking Types That Include None
UseOptional
to indicate that the argument allows None
.
Example:from typing import Optional
def find_student(name: str) -> Optional[str]:
students = ["Alice", "Bob", "Charlie"]
return name if name in students else None
- The return value of
find_student
is either a string (str
) orNone
.
Summary
In this section, we showed practical examples of using type hints for functions, classes, and variadic arguments. Correct use of type hints improves code readability and maintainability and helps prevent bugs before they occur. In the next section, “8. Frequently Asked Questions (FAQ),” we will address questions and misconceptions about type hints.
8. Frequently Asked Questions (FAQ)
Python type hints are a useful tool, but if you’re using them for the first time, questions and misunderstandings can come up. This section addresses common questions about type hints and provides clear answers.What problems arise if you don’t use type hints?
Python code will still run without type hints, but the following issues are more likely to occur.- Reduced readability If the types of functions and variables aren’t specified, other developers will take longer to understand the code.
def add(a, b):
return a + b
In this function, since the types of a
and b
are unknown, you can’t tell whether they’re meant to be numeric or string types.- Increased bugs Because types aren’t explicit, passing an incorrect type may go undetected and cause runtime bugs.
Do type hints improve execution speed?
No, type hints do not affect execution speed. Type hints are only “hints” and do not affect how Python itself operates. Type checking is done by static analysis tools (e.g., mypy), not at runtime.Is there a way to make type hints mandatory?
Python doesn’t provide a built-in mechanism to enforce type hints, but you can enforce a “no code without type hints” policy using the following methods.- Use static analysis tools By using the
--strict
option in mypy, you can treat functions without type hints as errors.
mypy --strict your_script.py
- Enforce via code reviews and CI/CD You can ensure type hints are enforced by setting rules in pull requests or CI/CD pipelines to check for their presence.
How can you address slow type checking with mypy?
In large projects, mypy’s type checking can become slow. You can improve performance using the following methods.- Use incremental mode Using the
--incremental
option checks only the changed parts.
mypy --incremental your_script.py
- Ignore some modules Ignore external modules that don’t need type checking with
--ignore-missing-imports
.
mypy --ignore-missing-imports your_script.py
What resources are recommended for beginners learning type hints?
The following resources can help you efficiently learn type hints from basics to advanced topics.- Official Python documentation (PEP 484) It explains the basic specification of type hints. PEP 484 – Type Hints
- Official Python type hints tutorial Provides detailed examples of actual usage. Typing Module
- Online learning platforms Searching for “Python type hints” courses on Udemy or Coursera can help you learn in a structured way.
When should you use type hints and when are they not necessary?
When to use type hints:
- Team development Using type hints makes it easier for other developers to understand the code.
- Large projects As a project grows, type hints help prevent bugs.
- Publishing external APIs or libraries Type hints make it easier for users to understand how to use your functions and classes.
When you don’t need to use type hints:
- Small, short-lived scripts Examples: simple data analysis or automation scripts
- Prototype code When creating prototypes, you may skip type hints to move faster.
What practical benefits does using type hints provide?
Using type hints provides the following practical benefits:- Early bug detection Static analysis based on type hints can catch bugs before runtime.
- Improved development efficiency Improved IDE autocomplete support speeds up coding.
- Improved maintainability Clear types make it easier for future readers to understand the code.
Summary
This section answered common questions about type hints. Type hints are easy to learn and can significantly improve developer productivity and code quality. Combining them with static analysis tools can maximize their benefits.
9. Summary
This article provided a detailed explanation of specifying argument types using Python type hints, covering basics to advanced topics, as well as how to use type-checking tools and practical use cases. Finally, we summarize the content and share key points for using type hints effectively.Importance of Type Hints
Type hints retain Python’s dynamic typing flexibility while offering many benefits, such as:- Improved readability By specifying type information in code, the roles of functions and variables become clear at a glance.
- Prevention of bugs via static analysis Detect type mismatches before runtime and reduce potential bugs.
- Increased development efficiency Leveraging IDE autocomplete makes coding smoother and reduces mistakes.
- Improved maintainability Clear types make code easier to understand for future readers.
Steps for Introducing Type Hints
Below are steps to effectively introduce type hints.1. Introduce them incrementally
When adding type hints to an existing project, it’s effective to introduce them incrementally using the steps below.- Add type hints to key functions and classes.
- Automate type checking using static analysis tools (e.g., mypy).
- Share type hinting rules within the team.
2. Avoid unnecessarily complex type annotations
Overly complex types can hurt readability. Use appropriate abstractions and type aliases to keep annotations concise.3. Use static analysis tools
Adopt static analysis tools like mypy or PyCharm to manage quality using type hints.Key points for leveraging type hints
Keeping the following points in mind will help you use type hints more effectively.- You don’t need to add type hints everywhere For small scripts or prototype code, it’s fine to omit type hints. The important thing is balance.
- Use official Python resources Refer to the official Python documentation (PEP 484 and the
typing
module) to learn the latest type hint specifications. - Choose type-checking tools suited to your development environment Select appropriate tools (e.g., mypy, pylance) based on your team’s size and the nature of the project.
The Future of Type Hints
Python’s type hints are likely to evolve further. New PEPs (Python Enhancement Proposals) are expected to enable more flexible and expressive type annotations. Learning type hints early and understanding how to use them will give you an advantage in future Python projects.Next Steps
After learning the basics and applications of type hints, try the following steps.- Add type hints to your project.
- Introduce static analysis tools and run type checks.
- Consult official documentation and resources related to type hints to deepen your knowledge.