rl
  • My Journey into Reinforcement Learning and Trading
  • ☺️Foundations of RL with Applications in Finance
    • Abstraction,Immutability,'dataclasses',Type Checking
    • Type variables(generics)
  • Functionality
  • Abstracting over Computation
  • Markov Models for Stock Prices: A Trade-Off Between Simplicity and Accuracy
  • Understanding Markov Processes and their Representations
  • Navigating State Transitions and Rewards: PR, P, RT, and R in MRP
  • Value Function Computation in Markov Reward Processes
  • State-Value and Action-Value Functions
  • module 1 synthesis
  • Strategies for Combining and Coordinating Multiple Utility Functions in Algorithmic Trading: A Multi
Powered by GitBook
On this page
  1. Foundations of RL with Applications in Finance

Type variables(generics)

Type variables or generics,Allow us to write flexible, reusable code by creating placeholder types that can that can stand for different types and different contexts。Especially in classes and functions。

The author used the TypeVar from Python's typing module。

from typing import TypeVar, Generic

#T can be any type
T = TypeVar("T")

#N can be int or float
N = TypeVar("N", int, float)
  • Since float can handle int in python ,N = TypeVar("N", int, float),"int"in the code is redundant?


Python's type system treats `int` and `float` as distinct types, even though a float can represent an integer value. So, even though it's true that floats can handle integers, it's not redundant to define a `TypeVar` that allows both `int` and `float`. It indicates to the type checker (and to other programmers) that a function or class that uses `N` is designed to work with both integers and floating-point numbers.
While a float in Python can represent an integer value (like `3.0`), an int can't fully represent a float. If you attempt to assign a floating-point value to an integer, Python will truncate the decimal part, leading to loss of information.
>>> int(3.5)
3
>>> float(3)
3.0

By inheriting from the Generic class, and specifying a particular type, you can create subclasses that work with specific data types.

Let's consider an example involving a generic class Box that holds a single item of any type. We then create subclasses of Box that are specific to certain data types.

First, let's define the generic class Box:

from typing import TypeVar, Generic

T = TypeVar('T')

class Box(Generic[T]):
    def __init__(self, item: T):
        self.item = item

    def get_item(self) -> T:
        return self.item

In the code above, Box is a generic class parameterized by T. It can hold an item of any type.

Now let's create a few subclasses that inherit from Box and are specific to certain data types:

class IntBox(Box[int]):
    pass

class StrBox(Box[str]):
    pass

class FloatBox(Box[float]):
    pass

Now, these subclasses IntBox, StrBox, and FloatBox are specialized versions of the Box class that are designed to work with int, str, and float types, respectively.

Let's see them in action:

# Creating instances of specialized box classes
int_box = IntBox(10)
str_box = StrBox('hello')
float_box = FloatBox(3.14)

# Getting items from the boxes
print(int_box.get_item())  # prints: 10
print(str_box.get_item())  # prints: hello
print(float_box.get_item())  # prints: 3.14
PreviousAbstraction,Immutability,'dataclasses',Type CheckingNextFunctionality

Last updated 1 year ago

☺️