我最近在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中的其他一些大名)。不过,我很乐意在评论中听到个人意见。
答案 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。