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.
我最近在 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.