Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从两个选项中选择一个强制参数的Python函数_Python_Function_Arguments - Fatal编程技术网

从两个选项中选择一个强制参数的Python函数

从两个选项中选择一个强制参数的Python函数,python,function,arguments,Python,Function,Arguments,我有一个功能: def delete(title=None, pageid=None): # Deletes the page given, either by its title or ID ... pass 但是,我的目的是让函数只接受一个参数(要么title要么pageid)。例如,delete(title=“MyPage”)或delete(pageid=53342)有效,而delete(title=“MyPage”,pageid=53342)无效。无法传递零个参

我有一个功能:

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

但是,我的目的是让函数只接受一个参数(要么
title
要么
pageid
)。例如,
delete(title=“MyPage”)
delete(pageid=53342)
有效,而
delete(title=“MyPage”,pageid=53342)
无效。无法传递零个参数。我该怎么做呢?

没有Python语法可以让您定义异或参数,不。如果指定了异或或参数,则必须显式引发异常:

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

我认为在函数签名本身中没有任何方法可以做到这一点。但是,您可以始终在函数内部进行检查,以查看是否同时设置了两个参数

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)

第二种方法不会阻止人们直接调用delete函数,因此,如果这对您来说真的很重要,我建议让它按照我的第一个示例抛出一个异常,或者是两个参数的组合。

如果两个参数都可以有任何值,包括
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')

这个模式很容易扩展到更多的参数。

我在想这个。。。这是唯一的解决方案吗?@TerryA:你必须明确地提出一个异常,是的。没有语法告诉Python为您检查这一点。
如果title不是None,pageid不是None:raisevalueerror
?我喜欢您的第二种方法