python-3.x 从类外部的staticmethod获取信息而不使用其示例

4szc88ey  于 2023-10-21  发布在  Python
关注(0)|答案(1)|浏览(125)

我有一个类,使用以下方法:

@staticmethod
def get_values(df: pd.DataFrame, val: str) -> pd.DataFrame:
    match val:
        case "mean_2_step":
            return (
                df["mean_2"]
                .shift()
                .rolling(window=10, min_periods=3, closed="right", step=2)
                .mean()
            )
        case "mean_4_step":
            return (
                df["mean_4"]
                .shift()
                .rolling(window=20, min_periods=4, closed="right", step=4)
                .mean()
            )
    return df

我想从该方法中获取信息,可能不调用它。该操作的主要目的是获取此信息(作为文档的一种形式)并将其保存在www.example.com中ReadMe.md,如下所示:
| 瓦尔|计算|
| --|--|
| 平均2步|df[“mean_2”].shift().rolling(window=10,min_periods=3,closed=“right”,step=2).mean()|
| 平均4步|df[“mean_4”].shift().rolling(window=20,min_periods=4,closed=“right”,step=4).mean()|
如何做到这一点?

jhdbpxl9

jhdbpxl91#

你要做的是解析函数源代码(body),以 <match pattern的形式获取特定节点match_case s的信息:match body>. inspectast模块是最好的。
假设你的类叫做MyClass
算法如下:

  • 使用inspect.getsource获取函数对象的源代码
  • 使用textwrap.dedent更正缩进,为进一步解析做准备
  • 将源代码解析为 AST 节点,其中包含ast.parse
  • 使用ast.walk遍历后代节点,同时仅过滤所需类型的节点ast.match_case
  • 挖掘节点属性的文本值以填充最终的嵌套框架
import inspect
import ast
import textwrap

src = textwrap.dedent(inspect.getsource(MyClass.get_values))
pat = re.compile(r'\s{2,}|\n', flags=re.M) # patern for eliminating extra whitespaces
match_cases = (n for n in ast.walk(ast.parse(src)) if isinstance(n, ast.match_case))

df = pd.DataFrame([[n.pattern.value.value,
                    pat.sub('', ast.get_source_segment(src, n.body[0].value))]
                   for n in match_cases], columns=['val', 'calcuation'])
print(df)
val                                                                             calcuation
0  mean_2_step  df["mean_2"].shift().rolling(window=10, min_periods=3, closed="right", step=2).mean()
1  mean_4_step  df["mean_4"].shift().rolling(window=20, min_periods=4, closed="right", step=4).mean()

相关问题