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

How do I pass a default parameter to a sub-function in a Pythonic way?

(为清晰起见进行了编辑)

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

我有使用 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/"):
    ...

然后是master函数,根据'mode'聚合参数运行不同的函数。

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 的地方吗?

感谢您的任何建议。如果有什么不清楚的地方,请在评论中告诉我,我将对此进行编辑 post.

嗨,我会像这样 Class 做一个大师:

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 这不是你想要的吗?

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

我建议将附加参数定义为 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