我正在尝试通过传递默认参数来解决这个问题。
我有使用 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 的地方吗?
重复自己总是一个坏主意(多次定义默认值)。
我建议将附加参数定义为 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
。
嗨,我会像这样开设大师班:
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 这不是你想要的吗?