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

Ter*_*ryA 5 python arguments function

我有一个功能:

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

但是,我的目的是让函数只接受一个参数(titleOR pageid)。例如,delete(title="MyPage")ordelete(pageid=53342)是有效的,而delete(title="MyPage", pageid=53342),则不是。不能传递零参数。我该怎么做呢?

Mar*_*ers 5

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

if (title and pageid) or not (title or pageid):
    raise ValueError('Can only delete by title OR pageid')
Run Code Online (Sandbox Code Playgroud)

完整的表达式可能会变得有点乏味,特别是如果title或pageid可以设置为0或另一个有效的错误值,因此您可以在实用程序函数中捕获上述内容:

if (title and pageid) or not (title or pageid):
    raise ValueError('Can only delete by title OR pageid')
Run Code Online (Sandbox Code Playgroud)

请注意,这是您测试所需内容的逆测试if,因此不要忘记添加not:

if not exclusive_or(title, pageid):
    # ...
Run Code Online (Sandbox Code Playgroud)

当必须测试时,它更容易使用not None:

if not exclusive_or(title is not None, pageid is not None):
    # ...
Run Code Online (Sandbox Code Playgroud)

请注意,我使用类型提示向函数添加信息,以便类型检查器和 IDE 来查看函数采用什么类型的参数或返回值类型是什么。

通过类型提示,您还可以标记原始函数并告诉这些工具您的函数仅接受一个或另一个参数,方法是使用@overload:

from typing import Any

def exclusive_or(left: Any, right: Any) -> bool:
    """Test if either left or right is true, but not both"""
    return (left or right) and not (left and right)
Run Code Online (Sandbox Code Playgroud)

在 PyCharm 或 Visual Studio Code(安装了 Pylance 扩展)等 IDE 中,将在您键入时显示有关该函数的实时信息:

Visual Studio Code 中代码片段的屏幕截图,显示“delete()”,工具提示显示“(title: str) -> None”和删除函数的文档字符串,以及指示这是两个函数之一的计数器该函数可能的完成方式

同一代码片段的另一个屏幕截图,这次工具提示更改为显示“(pageid: int) -> None”,计数器指示这是两个可能完成中的第二个

这种工具集成将使您更轻松地使用您的函数,而不会触发异常。