Python函数从两个选项中获取一个强制参数

时间:2016-08-28 08:45:36

标签: python function arguments

我有一个功能:

def delete(title=None, pageid=None):
    # Deletes the page given, either by its title or ID
    ...
    pass

但是,我的意图是函数只接受一个参数(titlepageid)。例如,delete(title="MyPage")delete(pageid=53342)有效,而delete(title="MyPage", pageid=53342)则不有效。零参数无法传递。我该怎么做呢?

3 个答案:

答案 0 :(得分:2)

没有Python语法可以让你定义独占或参数,没有。您必须明确提出异常是指定了两者,或者没有指定任何异常:

if (title and pageid) or not (title or pageid):
    raise ValueError('Can only delete by title OR pageid')

答案 1 :(得分:1)

我认为在功能签名本身中没有办法做到这一点。但是,您可以随时检查函数内部以查看是否已设置两个参数

def delete(title=None, pageid=None):
# Deletes the page given, either by its title or ID
    if title and pageid:
        # throw error or return an error value
pass

可以说,更好的方法是定义两个调用delete方法的方法

def delete_by_title(title):
    delete(title=title)

def delete_by_id(id):
    delete(pageid=id)

第二种方法不会阻止人们直接调用删除函数,所以如果这对你真的很重要,我建议按照我的第一个例子抛出异常,否则就是2的组合。

答案 2 :(得分:0)

如果两个参数都可以包含任何值,包括None,则解决方案是为它们使用sentinel对象。然后,您可以计算设置为非默认值的参数数量的总和:

NOT_SET = object()
def delete(title=NOT_SET, pageid=NOT_SET):
    if sum(i is not NOT_SET for i in [title, page_id]) != 1:
        raise ValueError('Can set only one of these')

此模式也可以轻松扩展到更多参数。