Python typehint int 作为正数

D. *_*ell 23 python type-hinting

我很好奇在 Python 中指定类型不仅是 aint而是正数的最佳方法是什么int

例子:

# As function argument

def my_age(age: int) -> str:
    return f"You are {age} years old."


# As class property

class User:
    id: int
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,负值都是错误的。如果我的 IDE/linter 能够发出警告,那就太好了。

有没有一种简单的方法可以使用类型提示将整数指定为正数?

soa*_*gem 18

虽然有点晚了,但现在有一个名为annotated-types 的库,它可以准确提供您想要的内容,并且是根据PEP-593实现此目的的“官方”方式。因此,对于正整数的示例,您可以使用内置typing.Annotated和带注释类型的Gt谓词,如下所示:

from typing import Annotated
from annotated_types import Gt


def my_age(age: Annotated[int, Gt(0)]) -> str:
    return f"You are {age} years old."


# As class property

class User:
    id: Annotated[int, Gt(0)]
Run Code Online (Sandbox Code Playgroud)

请注意,与 Python 中与类型提示相关的所有内容一样,这实际上并不在运行时强制执行约束。如果你想强制执行它,你仍然需要自己构建断言。


Luc*_*uez 9

如果您使用 FastAPI,则可以使用PositiveIntfrom pydantic.

from pydantic.types import PositiveInt


class Pizza:
    price: PositiveInt
Run Code Online (Sandbox Code Playgroud)

了解更多:https ://pydantic-docs.helpmanual.io/usage/types/#pydantic-types


Sam*_*ord 6

我的方法是定义一个NewType

PositiveInt = NewType('PositiveInt', int)
Run Code Online (Sandbox Code Playgroud)

也许还有一个助手,比如:

def assert_positive(n: int) -> PositiveInt:
    assert n > 0
    return PositiveInt(n)
Run Code Online (Sandbox Code Playgroud)

这不是铁定的(因为你仍然可以说PositiveInt(-5)或类似的话),但大多数类型都可以通过强制转换来覆盖;仅仅强制进行明确的声明就可以大大防止大多数错误。