Python 带有元组和 N pd 数据帧的函数注释?

Python function annotation with tuple and N pd DataFrames?

我有一个函数 returns N=4 pandas DataFrames。我可以像这样清楚地指定函数的所有类型:

import pandas as pd
from typing import Tuple 

def preprocess(df: pd.DataFrame) -> Tuple[pd.DataFrame, pd.DataFrame, pd.DataFrame, pd.DataFrame]:
    pass

但它有点冗长,我更喜欢更多 pythonic 注释,以防我必须 return 一个通常包含 N 元素的元组。由于 return 类型被指定为元组,并且对于元组初始化,有一个方便的 Python 功能可以通过简单地编写 (1,)*6 来替换像 (1,1,1,1,1,1) 这样的长初始化,我想了一个类似的方法也可能在这里起作用:

import pandas as pd
from typing import Tuple

N = 4 

def preprocess(df: pd.DataFrame) -> Tuple[pd.DataFrame] * N:
    pass

但这会引发错误:

unsupported operand type(s) for *: '_GenericAlias' and 'int'

如何相应地注释我的函数?

编辑: 我的目标不是动态设置注释。我只是好奇是否存在一种 pythonic 方式将任意长度的元组声明为 return 值,而不必编写像 Tuple[pd.DataFrame, pd.DataFrame, pd.DataFrame, pd.DataFrame] 这样的长注释。想象一下,例如,如果一个函数是 return N=20 个元组中的对象。

我不确定 tuple 是否可行,但您可以 return list[pd.DataFrame]。在某些情况下,它甚至可能比通用大小的元组更有意义。

你的问题肯定很有趣,如果没有类似的,也许它应该是一个 PEP!

如果注释的长度是可变的,您可以使用内置的省略号 ... 来表示附加项。

def preprocess(df: pd.DataFrame) -> Tuple[pd.DataFrame, ...]:
    pass

如果你想动态设置你的注解,你可以用长度为 1 的注解定义你的函数,然后修改它(函数注解的 return 部分)以获得所需的参数数量。

import pandas as pd
from typing import Tuple

N = 4

def preprocess(df: pd.DataFrame) -> Tuple[pd.DataFrame]:
    pass

preprocess.__annotations__['return'] *= N

help(preprocess)
# prints:
Help on function preprocess in module __main__:

preprocess(df: pandas.core.frame.DataFrame) -> Tuple[pandas.core.frame.DataFrame, 
      pandas.core.frame.DataFrame, 
      pandas.core.frame.DataFrame, 
      pandas.core.frame.DataFrame]