首页 > 解决方案 > 使用标记值作为默认值的类型提示参数

问题描述

当我无法在函数的签名中分配默认参数和/或已经有意义时,我目前使用此策略。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)

标签: pythontype-hintingmypypython-typingpython-3.9

解决方案


正如我所评论的,这是 Python 中一个活跃的开发领域。PEP 661建议添加一个sentinel创建哨兵对象的函数,但在该 PEP 获得批准之前,您只能靠自己。

但是,您可以从 PEP 中的一些建议(或拒绝)选项中获得灵感。一种非常简单的方法可以很好地与类型提示配合使用,即使您的哨兵值成为一个类:

class DEFAULT: pass

现在您可以将您的函数类型提示为采用包括以下类型的联合type[DEFAULT]

def spam(ham: list[str]|None|type[DEFAULT] = DEFAULT):

推荐阅读