未定义值的 Python 类型提示以区别于 None

Sza*_*lcs 6 type-hinting python-3.x

我想创建一个函数签名,其中undefinedvalue 和None彼此不同。

所以例如:

undefined = object()

def update(id: str, title: str = undefined, description: str):
    data = {
        "title": title,
        "description": description,
    }

    // remove undefined key-value pairs from data
    for key in data.keys():
        if data[key] is undefined:
            del data[key]
    
    # send data to the server for further processing
Run Code Online (Sandbox Code Playgroud)

显然,这样我会得到冲突的类型和以下错误:Incompatible default for argument "description" (default has type "object", argument has type "str")

从上面的例子可以看出,传递None是完全有效的,因为它将被替换为nullJSON 的值,而如果undefined传递则不会在数据中考虑该值。

我尝试定义未定义的类型,例如:

UndefinedStr = typing.Union[str, undefined]
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误:Variable "undefined" is not valid as a type

我想那是因为这undefined是一个例子。因此,作为一种解决方法,我可以这样做:

class Undefined:
    pass

undefined = Undefined()

UndefinedStr = Union[str, Undefined]
Run Code Online (Sandbox Code Playgroud)

这个解决方案有效,但对我来说感觉有点太宽泛了。

所以我的问题是输入提示这个未定义用例的最佳方法是什么?

更新

请不要关注以下事实:在示例中参数的类型titlestr,这个问题背后的主要目的是为可以与任何其他类型联合使用的哨兵对象找到通用类型提示。

与此同时,我在PEP-0661中看到了这个特定问题的一些进展,因此似乎这已成为一个更广泛的讨论主题。

Sza*_*lcs 0

到目前为止,最好的提案是PEP-661提供的。让我们检查一下并监控它的可能实现。