Type annotations: tuple type vs union type
Question:
def func(df_a: pd.DataFrame, df_b: pd.DataFrame) -> (pd.DataFrame, pd.DataFrame):
Pylance is advising to modify this line with two solution proposed. What would be the pros and cons of each one if there is any significant difference?
Tuple expression not allowed in type annotation
Use Tuple[T1, …, Tn] to indicate a tuple type or Union[T1, T2] to indicate a union type
Answers:
A union type wouldn’t make sense here since the types are the same.
If you want to indicate that a tuple is being returned, you’d use Tuple[pd.DataFrame, pd.DataFrame]
in older versions of Python, or tuple[pd.DataFrame, pd.DataFrame]
in newer versions of Python. See here for more information.
2023 edit
In newer versions of Python (>=3.10), you should use:
tuple[A, B, C]
instead of Tuple[A, B, C]
(yes, that’s the built-in tuple
function)
A | B
instead of Union[A, B]
The answer itself is still relevant, even if the newer style makes the difference between Tuple
/tuple
and Union
/|
more apparent.
Original answer
They mean different things:
Tuple[A, B, C]
means that the function returns a three-element tuple with the A B C data types:
def f() -> Tuple[str, int, float]:
return 'hello', 10, 3.33
Union[A, B]
means that the function returns an object of either A or B data type:
import random
def f() -> Union[str, int]:
if random.random() > 0.5:
return 'hello'
else:
return 10
In your case, it looks like you want to use Tuple[pd.DataFrame, pd.DataFrame]
.
def func(df_a: pd.DataFrame, df_b: pd.DataFrame) -> (pd.DataFrame, pd.DataFrame):
Pylance is advising to modify this line with two solution proposed. What would be the pros and cons of each one if there is any significant difference?
Tuple expression not allowed in type annotation
Use Tuple[T1, …, Tn] to indicate a tuple type or Union[T1, T2] to indicate a union type
A union type wouldn’t make sense here since the types are the same.
If you want to indicate that a tuple is being returned, you’d use Tuple[pd.DataFrame, pd.DataFrame]
in older versions of Python, or tuple[pd.DataFrame, pd.DataFrame]
in newer versions of Python. See here for more information.
2023 edit
In newer versions of Python (>=3.10), you should use:
tuple[A, B, C]
instead ofTuple[A, B, C]
(yes, that’s the built-intuple
function)A | B
instead ofUnion[A, B]
The answer itself is still relevant, even if the newer style makes the difference between Tuple
/tuple
and Union
/|
more apparent.
Original answer
They mean different things:
Tuple[A, B, C]
means that the function returns a three-element tuple with the A B C data types:
def f() -> Tuple[str, int, float]:
return 'hello', 10, 3.33
Union[A, B]
means that the function returns an object of either A or B data type:
import random
def f() -> Union[str, int]:
if random.random() > 0.5:
return 'hello'
else:
return 10
In your case, it looks like you want to use Tuple[pd.DataFrame, pd.DataFrame]
.