如何以 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
。
(为清晰起见进行了编辑)
我正在尝试通过传递默认参数来解决这个问题。
我有使用 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
。