【发布时间】:2021-09-19 00:16:37
【问题描述】:
当我无法在函数签名中分配默认参数和/或None 已经有意义时,我目前使用this strategy。
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)
- 如何在 mypy 中输入提示
ham而不会出现错误? 或 - 我应该使用什么策略来代替
DEFAULT = object()?
【问题讨论】:
-
我最近一直在做的事情是:
DEFAULT = (DefaultType := types.new_class("DefaultType"))(),然后使用Union[List[str], DefaultType]输入提示。 -
这是 Python 语言开发中的一个活跃话题,PEP 661 提议将新的哨兵创建者添加到标准库中。该 PEP 尚未被接受,因此它可能会或可能不会成为一件事,但您可能同时借用其中一个建议的实现供您自己使用。我特别热衷于向make sentinels types that are their own metatype (a mind-bending idea that greatly simplifies type annotations) 提出一个不太严肃的建议。
-
我很欣赏你的两位 cmets。虽然我仍在审查它们,但我认为它们直接解决了这个问题。知道这个话题还没有解决,我感到很欣慰。
标签: python type-hinting mypy python-typing python-3.9