在 python 中为函数定义输入参数时更灵活?

More flexibility in defining input arguments for a function in python?

提问人:Roma V 提问时间:8/15/2022 更新时间:8/15/2022 访问量:70

问:

我有以下函数,我正在使用它来运行分析。

当我设置时,它应该运行整个第一段分析,输出图 1、2 和 3。当我设置时,它应该运行整个第二部分分析,输出图 4、5 和 6。run_analysis_1 = Truerun_analysis_2 = True

def save_locally(self,
                 run_all_analysis: bool = False,
                 run_analysis_1: bool = False,
                 run_analysis_2: bool = False):

    if run_analysis_1 = True
        plot_1 # some function that creates plot 1 + saves to local folder
        plot_2 # some function that creates plot 2 + saves to local folder
        plot_3 # some function that creates plot 3 + saves to local folder
    
    if run_analysis_2 = True
        plot_4 # some function that creates plot 4 + saves to local folder
        plot_5 # some function that creates plot 5 + saves to local folder
        plot_6 # some function that creates plot 6 + saves to local folder

我希望在选择我想要运行的地块时有很大的灵活性,这样我就能够:

  1. 运行整个分析(例如,运行分析 1 的所有分量以输出图 1、2 和 3)
  2. 运行分析的一部分(例如,仅运行分析 1 中的绘图 1)

所以它看起来像下面这样......

save_locally(run_analysis_1.plot_1=True, run_analysis_2.all=True)

有没有办法做到这一点?

python 函数 参数传递

评论


答:

1赞 Mandera 8/15/2022 #1

这样的东西可能对你有用;

  • 将分析中的所有图存储在其自己的类中
  • 自定义属性,用于将所有定义的绘图存储在一个列表中all
  • 更改 的签名 to takesave_locally*args

会让你像这样非常干净地调用你的函数:

save_locally(Analysis1.plot1, Analysis1.plot2, Analysis2.all)


from itertools import chain

class _Analysis:
    all = ...
    def __init_subclass__(cls, **kwargs):
        cls.all = [value for key, value in cls.__dict__.items() if not key.startswith("_")]

class Analysis1(_Analysis):
    plot1 = "a"
    plot2 = "b"
    plot3 = "c"

class Analysis2(_Analysis):
    plot4 = "d"
    plot5 = "e"
    plot6 = "f"


def save_locally(*plots):
    plots = chain(*plots)  # Flatten - lets us write Analysis.all without *
    for plot in plots:
        print(plot, end=" ")  # Do whatever with plot

save_locally(Analysis1.plot1, Analysis1.plot2, Analysis2.all)

>>> a b d e f 

评论

1赞 Roma V 8/15/2022
太棒了,这就是我所追求的!