Python中重载参数的命名约定

时间:2016-07-14 09:48:45

标签: python parameters overloading

我最近在Python(numpy)中编写了一个方法,可以在单个元素上执行操作,也可以在数组上执行元素操作。

例如:

def addOne(self, i):
    bigArray[i] += 1

这里i可以是单个索引,也可以是它们的数组,这使得描述性命名变得困难。

而且,在更一般的情况下,如何命名重载的参数可能具有非常不同的含义?这是一个(相当人为的)例子:

def doTheThing(flag, item):
    if(flag == 0):
        useOneWay(item)
    else:
        useTotallyOtherWay(item)

如果item代表两个完全不同的东西,取决于flag,它应该如何命名?

有两个带默认值的命名参数会更好吗? e.g。

def doTheThing(flag, item1=None, item2=None):

也许这样的场景本身就表明编程实践不好,最好的解决方案是重新分解成处理每种情况的不同方法。

基本上,是否有一个Python命名约定在这里提供方向?我在PEP8中找不到任何专门引用参数重载的内容。

要尝试保持这个主题并且没有意见,请在您的答案中引用一些有信誉的来源(PEP8或Python中的其他一些大名)。不过,我很乐意在评论中听到个人意见。

1 个答案:

答案 0 :(得分:1)

你可以做几件事。首先是相应地命名变量:

def addOne(self, i_or_is):
    if not isinstance(i_or_is, list):
        i_or_is = [i_or_is]
    ...

但在这种情况下,更好的解决方案可能是采用*args

def addOne(self, *list_of_is):
    ...

可以像add(1)add(1, 2, 3)甚至add(*list_)一样调用(最后一个示例将现有列表解压缩到*args)。

如果你的论点可能意味着不同的东西,那么你确实可以将它们分成2个参数而只接受一个参数。标准库在logging module

中执行此操作
  

stream - 使用指定的流初始化StreamHandler。请注意,此参数与'filename'不兼容 - 如果两者都存在,则会引发ValueError。