从两个选项中选择一个强制参数的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
?我喜欢您的第二种方法