Python 中重载参数的命名约定

Naming Convention for Overloaded Parameters in Python

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

例如:

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

这里i可以是单个索引,也可以是索引数组,描述性命名比较困难。

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

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

这里如果item代表两个完全不同的东西,要看flag,应该怎么命名呢?

有两个默认的命名参数会更好吗?例如

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

也许出现这种情况本身就是不良编程习惯的表现,最好的解决方案是重构为不同的方法来处理每种情况。

基本上,是否有 Python 命名约定在这里给出方向?我在 PEP8 中找不到任何具体引用参数重载的内容。

为了尽量保持这个话题切题并且不自以为是,请在您的回答中引用一些有信誉的来源(PEP8 或 Python 中的其他知名人士)。不过,我很乐意在评论中听到个人意见。

您可以做几件事。第一件事是相应地命名您的变量:

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 - Use the specified stream to initialize the StreamHandler. Note that this argument is incompatible with ‘filename’ - if both are present, a ValueError is raised.