如何以 Python 方式将默认参数传递给子函数?

问题描述 投票:0回答:2

我正在尝试通过传递默认参数来解决这个问题。

我有使用 matplotlib 创建绘图的函数。这些函数接受参数,其中一些具有默认值:

def radar_with_CI(values, categories, group=0):
    ...


def multi_radar_with_CI(values,
                        categories,
                        fname: str,
                        series_names="Series",
                        pth="t:/Projects/dev/Plotter/"):
    ...


def overlay_radar_with_CI(values,
                          categories,
                          fname: str,
                          series_names="Series",
                          pth="t:/Projects/dev/Plotter/"):
    ...

然后是一个主函数,它聚合参数并根据“模式”运行不同的函数。

def radar(values,
          categories,
          fname,
          series_names="Series",
          pth="",
          mode="all",
          group=None):

    if mode == "single":
        radar_with_CI(values, categories, group=group)

    if mode == "one-by-one" or mode == "all":
        multi_radar_with_CI(values,
                            categories,
                            series_names=series_names,
                            fname=fname,
                            pth=pth)

    if mode == "overlay" or mode == "all":
        overlay_radar_with_CI(values,
                              categories,
                              series_names=series_names,
                              fname=fname,
                              pth=pth)

事情是,我需要一个默认参数,例如

series_names
,但我在主函数和绘图函数本身中都需要这个默认参数,以便能够通过主函数和单独调用它们。

在上面的代码中,我当前的解决方案已实现:我在主函数和绘图函数中都设置了默认参数。

这是正确的解决方案吗?或者将默认参数堆叠在自身上是一种不好的做法(换句话说,发送与默认参数具有相同值的参数)?这是使用 args 或 kwargs 的地方吗?

python parameters default-arguments
2个回答
1
投票

重复自己总是一个坏主意(多次定义默认值)。

我建议将附加参数定义为 kwargs 并在函数调用中解压它们:

def radar(values,
      categories,
      *,
      mode="all",
      **kwargs
      ):
if mode == "single":
    radar_with_CI(values, categories, **kwargs)

if mode == "one-by-one" or mode == "all":
    multi_radar_with_CI(values,
                        categories,
                        **kwargs)

if mode == "overlay" or mode == "all":
    overlay_radar_with_CI(values,
                          categories,
                          **kwargs)

因此,您可以调用雷达函数,定义一个参数(fname),并使用原始函数中其他参数的默认值。

radar([1,2,3], ['A','B','C'], mode='overlay', fname='test')

请注意,如果您传递未由被调用函数定义的关键字参数,您将收到

TypeError


1
投票

嗨,我会像这样开设大师班:

class Master:
    def __init__(self,mode,firstName='Tom',lastName='Smith'):
        self.firstName = firstName
        self.lastName = lastName
        self.mode = mode

        if self.mode == 'ModeA':
            self.functionOne()

        if self.mode == 'ModeB':
            self.functionTwo()

    def functionOne(self):
        print(self.firstName + ' ' + self.lastName)

    def functionTwo(self):
        print(self.lastName + ', ' + self.firstName)

a = Master('ModeA',lastName='Porter')
a = Master('ModeB',lastName='Porter')
a = Master('ModeB',firstName='Jeff',lastName='Charles')    

输出:

Tom Porter
Porter, Tom
Charles, Jeff

@Ondřej Janča 这不是你想要的吗?

© www.soinside.com 2019 - 2024. All rights reserved.