我有一个功能:
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)
则不有效。零参数无法传递。我该怎么做呢?
答案 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')
此模式也可以轻松扩展到更多参数。