python - 使用标记值作为默认值的类型提示参数
问题描述
当我无法在函数的签名中分配默认参数和/或已经有意义时,我目前使用此策略。None
from typing import Optional
DEFAULT = object()
# `None` already has meaning.
def spam(ham: Optional[list[str]] = DEFAULT):
if ham is DEFAULT:
ham = ['prosciutto', 'jamon']
if ham is None:
print('Eggs?')
else:
print(str(len(ham)) + ' ham(s).')
错误:
Failed (exit code: 1) (2607 ms)
main.py:7: error: Incompatible default for argument "ham" (default has type "object", argument has type "Optional[List[str]]")
Found 1 error in 1 file (checked 1 source file)
- 如何
ham
在 mypy 中输入提示而不出现错误?或者 - 我应该使用什么策略来代替
DEFAULT = object()
?
解决方案
正如我所评论的,这是 Python 中一个活跃的开发领域。PEP 661建议添加一个sentinel
创建哨兵对象的函数,但在该 PEP 获得批准之前,您只能靠自己。
但是,您可以从 PEP 中的一些建议(或拒绝)选项中获得灵感。一种非常简单的方法可以很好地与类型提示配合使用,即使您的哨兵值成为一个类:
class DEFAULT: pass
现在您可以将您的函数类型提示为采用包括以下类型的联合type[DEFAULT]
:
def spam(ham: list[str]|None|type[DEFAULT] = DEFAULT):
推荐阅读
- python - 在python中创建一个作为另一列的条件平滑移动平均值的列
- r - 如何跨多个列表映射具有多个变量的函数
- verilog - 如何在 Verilog 测试台中写入字符串值?
- python - 如何在单个不和谐消息中发送 for 循环的结果?
- python - 如何使模块的日志记录静音?
- regex - 正则表达式测验。带转义的引用文本
- ios - 自动更正更改文本时 UITextField 没有回调
- angular - Angular 8 - 材料表在删除时不显示正确的数据
- java - Axon FrameWork:如何在 domain_event_entry 表中回滚
- javascript - 为什么新的 expo init 会产生“导出默认函数”而不是“导出默认类”?在 App.js 中