gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 00:46:48 26 4
gpt4 key购买 nike

我有一个函数:

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 ),不是。不能传递零参数。我该怎么做呢?

最佳答案

没有 Python 语法可以让您定义异或参数,不。你必须明确提出一个异常(exception)是指定或没有指定:

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

完整的表达式可能会变得有点乏味,尤其是当 titlepageid 可以设置为 0 或其他有效的假值时,因此您可以在效用函数中捕获以上内容:

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)

请注意,这是对 if 测试所需内容的逆向测试,所以不要忘记添加 not:

if not exclusive_or(title, pageid):
# ...

在必须测试 not None 时使用起来更容易:

if not exclusive_or(title is not None, pageid is not None):
# ...

请注意,我使用了 type hints为类型检查器和 IDE 向函数添加信息,以查看函数采用何种参数或返回值类型是什么。

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

@overload
def delete(title: str) -> None: ...

@overload
def delete(pageid: int) -> None: ...

def delete(title: Optional[str] = None, pageid: Optional[int] = None) -> None:
"""Deletes the page given, either by its title or ID"""
...
pass

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

Screenshot of a snippet of code in Visual Studio Code reading "delete()', with a tooltip showing "(title: str) -> None" and the documentation string for the delete function, together with a counter indicating this is one of two possible completions for this function

Another screenshot of the same snippet of code, this time with the tooltip changed to show "(pageid: int) -> None", with the counter indicating that this is the second of two possible completions

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

关于从两个选项中获取一个强制参数的 Python 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39189472/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com